Apache-2.4

Apache 重定向到相同的路徑,但帶有 # 片段

  • June 26, 2019

我想#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 APIreplaceState()(或可能pushState()的)方法將#bar片段標識符附加到 URL 並觸發客戶端響應。不需要伺服器端重定向。

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