簡體   English   中英

Apache mod_rewrite 將錨點添加到查詢字符串

[英]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]
  • 無需同時使用LEND標志。 L標志停止當前輪次處理, END標志停止重寫引擎的所有進一步處理。 但是,當與R標志一起使用時,它們的行為完全相同 - 無論您使用L還是END標志,所有進一步的處理都會停止。

  • query=[a-zA-Z0-9\s]*$ - 您使用了\s (空格)速記字符 class - 這是多余的,因為它永遠不會在這里匹配。 (您的查詢字符串值實際上可以包含空格嗎?) QUERY_STRING服務器變量是 % 編碼的,因此永遠不會有文字空格。 請求的查詢字符串中的任何空格都將是 URL 編碼為%20+

  • RewriteRule指令上的NCnocase標志)是多余的,因為無論如何您都在匹配“所有內容”(即.* )。 無論如何,我敢打賭這完全是多余的,因為您沒有在前面需要它的條件下使用NC標志 - 如果有的話。

  • (.*) - 在發布的規則中,不需要帶括號的子模式(捕獲組),因為沒有在任何地方使用反向引用。

  • RewriteCond %{REQUEST_URI} ^/foo$ - 不需要這個條件,因為 URL 路徑可以在RewriteRule模式中更有效地執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM