[英]Apache mod_rewrite adding anchor to query string
我正在嘗試使用查詢字符串向 URL 添加錨點。 原URL是
https://example.com/foo?query=123
它應該重定向到
https://example.com/foo?query=123#anchor
這些是我在.htaccess
文件中的規則:
RewriteCond %{REQUEST_URI} ^/foo$
RewriteCond %{QUERY_STRING} ^query=[a-zA-Z0-9\s]*$
RewriteRule (.*) /foo?%{QUERY_STRING}#anchor [NC,NE,R=302,L,END]
您知道如何避免重定向循環嗎?
使用您顯示的示例,您能否嘗試以下操作。 請確保在測試您的 URL 之前清除您的瀏覽器緩存。
RewriteEngine ON
RewriteCond %{THE_REQUEST} \s/([\w-]+\?query=\d+)\s [NC]
RewriteRule ^ %1#anchor [L,R,NE]
您知道如何避免重定向循環嗎?
在不以某種方式更改 URL 路徑或查詢字符串的情況下,服務器端 (Apache / .htaccess
) 重定向是不可能的。
#anchor
(或片段標識符)未在重定向請求中傳遞給服務器,因此相同的 URL 匹配您的規則並觸發另一個重定向到 append #anchor
,一次又一次,等等。
當您請求/foo?query=123
時,請求是 302 重定向到/foo?query=123#anchor
(您發布的規則已經這樣做了)。 但是,瀏覽器僅在重定向請求中發回/foo?query=123
(無片段標識符),因此該過程重新開始。
防止“服務器端”重定向中的重定向循環的唯一方法是以某種方式更改 URL 的其他元素,然后您可以在規則中檢測到這些元素。 例如。 重定向到/bar?query=123#anchor
或/foo?query=123&noredirect=1#anchor
等。
但是,片段標識符 ( #anchors
) 僅由客戶端腳本/HTML 使用,因此如果在#anchor
上需要 #anchor,則應使用 JavaScript 添加它。
旁白:關於您現有規則的幾點說明:
RewriteCond %{REQUEST_URI} ^/foo$ RewriteCond %{QUERY_STRING} ^query=[a-zA-Z0-9\s]*$ RewriteRule (.*) /foo?%{QUERY_STRING}#anchor [NC,NE,R=302,L,END]
無需同時使用L
和END
標志。 L
標志停止當前輪次處理, END
標志停止重寫引擎的所有進一步處理。 但是,當與R
標志一起使用時,它們的行為完全相同 - 無論您使用L
還是END
標志,所有進一步的處理都會停止。
query=[a-zA-Z0-9\s]*$
- 您使用了\s
(空格)速記字符 class - 這是多余的,因為它永遠不會在這里匹配。 (您的查詢字符串值實際上可以包含空格嗎?) QUERY_STRING
服務器變量是 % 編碼的,因此永遠不會有文字空格。 請求的查詢字符串中的任何空格都將是 URL 編碼為%20
或+
。
RewriteRule
指令上的NC
( nocase
標志)是多余的,因為無論如何您都在匹配“所有內容”(即.*
)。 無論如何,我敢打賭這完全是多余的,因為您沒有在前面需要它的條件下使用NC
標志 - 如果有的話。
(.*)
- 在發布的規則中,不需要帶括號的子模式(捕獲組),因為沒有在任何地方使用反向引用。
RewriteCond %{REQUEST_URI} ^/foo$
- 不需要這個條件,因為 URL 路徑可以在RewriteRule
模式中更有效地執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.