Apache-2.2
如何模擬 Apache和ñD和ñDEND重定向標誌?
出於業務特定的原因,我
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
模式,所以我最終得到了來自瀏覽器*的“網頁導致太多重定向”*錯誤。我研究了很長時間,並沒有找到“好的”解決方案。我嘗試過的事情:
- 使用$$ END $$旗幟。不幸的是,在我的 Apache 版本上不可用,也不適用於重定向。
- 使用
%{ENV:REDIRECT_STATUS}
onRewriteCond
子句結束重寫過程 (L)。由於某種原因%{ENV:REDIRECT_STATUS}
,我嘗試過的所有時間都是空的。- 如果我的規則匹配,則使用 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 的歧義。