Apache-2.4
Apache 重定向到相同的路徑,但帶有 # 片段
我想
#fragment
為客戶端附加一個以讀取某些 URL(並由 SPA 使用)。<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^foo/? /foo#bar [QSA,NE,L,R=301] </IfModule>
但是,由於
#bar
是上面 URL 中的一個片段,它似乎被剝離並導致重定向循環。我也嘗試過像RewriteRule ^foo/? /foo\#bar
.有沒有辦法將其限制
RewriteRule
為一個重定向?
- 我正在將其寫入
.htaccess
目標目錄中的文件。網路伺服器是httpd -v
Server version: Apache/2.4.39
(centos)
我也嘗試過像 …
問題不在於重定向響應。
/foo#bar
正在標頭中正確地發送回客戶端Location:
(該NE
標誌通過防止#
在響應中進行 URL 編碼來幫助此處)。問題是瀏覽器沒有在**重定向請求上將片段標識符發送回伺服器(正如@Gerald 所說,“
$$ Fragments $$永遠不會傳輸到伺服器”)。因此,伺服器會反复看到
/foo
,因此會出現重定向循環。對於失去的片段標識符,您無能為力。 從伺服器的角度來看,您可能需要以其他方式更改 URL,可能是通過附加查詢字元串參數。例如:RewriteCond %{QUERY_STRING} !^redirect RewriteRule ^foo/? /foo?redirect=1#bar [QSA,NE,R,L]
上面將 URL 參數附加
redirect=1
到重定向響應中,並且條件確保在進行重定向之前該參數不存在。但是,附加 URL 參數可能是不可取的。
由於這僅供 SPA 中的客戶端使用,因此您應該使用JavaScript History API和
replaceState()
(或可能pushState()
的)方法將#bar
片段標識符附加到 URL 並觸發客戶端響應。不需要伺服器端重定向。