Dot-Htaccess

htaccess 將所有帶有問號參數的 url 重定向到沒有

  • December 3, 2020

我檢查了很多,我的問題。有一些接近,但沒有一個可以解決我的問題。

我需要永久重定向所有以此結尾的 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=listmode=grid(完全)查詢字元串的 URL,然後重定向到相同的 URL 路徑並丟棄查詢字元串(QSD-Query String Discard)。這QSD是 Apache 2.4 的新功能(我假設您正在使用它)。如果您省略該QSD標誌,那麼您將獲得一個重定向循環(因為查詢字元串將重新附加到重定向的 URL)。

請注意,以上內容與查詢字元串完全匹配(如您的範例中所示)。如果查詢字元串中有任何其他 URL 參數或大小寫不同,則匹配失敗。

請注意,這是一個 302(臨時)重定向。只有當您確認它可以正常工作時,才將其更改為 301(永久)- 如果這是有意的。301 由瀏覽器持久記憶體,因此可能會使測試出現問題。

參考:

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