Apache-2.2

如何模擬 Apache和ñD和ñDEND重定向標誌?

  • November 6, 2019

出於業務特定的原因,我RewriteRule為 Apache 2.2.22 (mod_rewrite) 創建了以下內容:

RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1 [R=301,L]

如果給定一個 URL,例如:

http://www.example.com/site/0999/document.html

被翻譯成:

http://www.example.com/site/document/0999.html

這是預期的情況。但是,有些文件的名稱只是數字。所以考慮以下情況:

http://www.example.com/site/0055/0666.html

被翻譯成:

http://www.example.com/site/0666/0055.html

這也符合我的RewriteRule模式,所以我最終得到了來自瀏覽器*的“網頁導致太多重定向”*錯誤。

我研究了很長時間,並沒有找到“好的”解決方案。我嘗試過的事情:

  1. 使用$$ END $$旗幟。不幸的是,在我的 Apache 版本上不可用,也不適用於重定向。
  2. 使用%{ENV:REDIRECT_STATUS}onRewriteCond子句結束重寫過程 (L)。由於某種原因%{ENV:REDIRECT_STATUS},我嘗試過的所有時間都是空的。
  3. 如果我的規則匹配,則使用 Header 子句添加響應標頭,然後檢查該標頭(有關詳細資訊,請參閱:此處)。似乎 a) REDIRECT_addHeader 為空 b) 標頭無法在 301 響應中顯式設置。

還有另一種選擇。我可以為重定向 URL 設置一個查詢參數,表明它來自重定向,但我不喜歡該解決方案,因為它看起來太 hacky。

有沒有辦法完全按照[END]標誌的作用,但在舊的 Apache 版本中?比如我的2.2.22。

向重定向添加查詢參數是最佳選擇。由於各種原因,它經常發生。

例如製定這樣的規則:

RewriteCond %{QUERY_STRING}  !redirected
RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1?redirected [R=301,L]

現在發生的情況是重定向到添加了“?redirected”的URL。因此第二次不應用該規則。

$$ END $$flag 在這裡不相關,因為您正在提供 301 重定向。作為您連結到各州的文件…

這不適用於由外部重定向產生的新請求。

如果你真的需要做這種重定向,那麼你需要找到其他方法來消除新舊 URL 的歧義。

引用自:https://serverfault.com/questions/519171