htaccess 將所有帶有問號參數的 url 重定向到沒有
我檢查了很多,我的問題。有一些接近,但沒有一個可以解決我的問題。
我需要永久重定向所有以此結尾的 URL:
?mode=list
和
?mode=grid
到沒有(刪除問號及其後面的內容)
例子:
example.com/random-url-here?mode=grid redirect to example.com/random-url-here
和
example.com/whatever-url-here?mode=list redirect to example.com/random-url-here
我試過這個:
RewriteEngine on RewriteRule (.*)$^mode=list $1 RewriteRule (.*)$^mode=grid $1
和這個
RewriteEngine on RewriteRule (.*)$^mode=list $1 [L,R=301] RewriteRule (.*)$^mode=grid $1 [L,R=301]
但它不起作用。顯然,我不明白這是如何工作的。請幫忙。
謝謝
example.com/random-url-here?mode=grid
第一個 URL 之後的部分
?
(即mode=grid
在此範例中)稱為查詢字元串。RewriteRule (.*)$^mode=list $1 [L,R=301]
該
RewriteRule
指令最多需要 3 個參數:RewriteRule pattern substitution [flags]
該指令的模式(第一個參數)
RewriteRule
是一個正則表達式(正則表達式),它僅與請求的 URL-path匹配,特別是不包括查詢字元串。因此,您無法使用該RewriteRule
指令匹配查詢字元串。要匹配查詢字元串,您需要使用附加
RewriteCond
(條件)指令並檢查QUERY_STRING
伺服器變數。RewriteCond
指令將條件應用於後面的RewriteRule
指令。但是,正則表達式
(.*)$^mode=list
(除了嘗試匹配查詢字元串)在這種情況下永遠不會匹配。$
斷言行尾並^
斷言行首 - 所以這總是會失敗。在上面的範例中,
$1
反向引用(在替換字元串中)正在嘗試匹配 URL 路徑。但是,此 URL 路徑(在目錄上下文中,即。.htaccess
)不以斜杠開頭(即,它是relative),因此將導致格式錯誤的重定向,除非您在文件的RewriteBase
其他位置也定義了指令。相對.htaccess
替換字元串被視為相對於包含文件的目錄的文件系統路徑。.htaccess
如果您在此上下文中省略
R
(redirect
) 標誌(如在您的第一個範例中),那麼它將嘗試在內部重寫請求(而不是外部重定向),因此可見 URL 不會更改。
.htaccess
請在根文件頂部附近嘗試以下操作:RewriteEngine On RewriteCond %{QUERY_STRING} ^mode=(list|grid)$ RewriteRule (.*) /$1 [QSD,R=302,L]
上述狀態……對於所有
(.*)
具有mode=list
或mode=grid
(完全)查詢字元串的 URL,然後重定向到相同的 URL 路徑並丟棄查詢字元串(QSD
-Query String Discard)。這QSD
是 Apache 2.4 的新功能(我假設您正在使用它)。如果您省略該QSD
標誌,那麼您將獲得一個重定向循環(因為查詢字元串將重新附加到重定向的 URL)。請注意,以上內容與查詢字元串完全匹配(如您的範例中所示)。如果查詢字元串中有任何其他 URL 參數或大小寫不同,則匹配失敗。
請注意,這是一個 302(臨時)重定向。只有當您確認它可以正常工作時,才將其更改為 301(永久)- 如果這是有意的。301 由瀏覽器持久記憶體,因此可能會使測試出現問題。
參考: