htaccess 將所有有問號參數的 url 重新導向為不含問號參數

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]

但這不起作用。顯然,我不明白這是如何運作的。請幫忙。

謝謝

答案1

example.com/random-url-here?mode=grid

第一個 URL 之後的部分?(即mode=grid本例中)稱為請求參數

RewriteRule (.*)$^mode=list $1 [L,R=301]

RewriteRule指令最多需要 3 個參數:

RewriteRule pattern substitution [flags]

圖案RewriteRule指令的(第一個參數)是與請求的匹配的正規表示式(regex)僅 URL 路徑,它特別排除了查詢字串。因此,您無法使用該RewriteRule指令來匹配查詢字串。

要符合查詢字串,您需要使用附加RewriteCond(條件)指令並檢查QUERY_STRING伺服器變數。RewriteCond指令適用狀況RewriteRule以下指令。

但是,正則表達式(.*)$^mode=list(除了嘗試匹配查詢字串之外)將絕不在此背景下進行配對。$斷言行結束並^斷言行開始 - 所以這總是會失敗。

在上面的範例中,$1反向引用(在替換字串) 正在嘗試符合 URL 路徑。然而,這個 URL 路徑(在目錄上下文,即。.htaccess)不以斜線開頭(即它是相對的),因此將導致格式錯誤的重定向,除非您RewriteBase在檔案中的其他位置也定義了指令.htaccess。 A相對的替換字串被視為相對於包含該檔案的目錄的檔案系統路徑.htaccess

如果您在此上下文中省略R( redirect) 標誌(如第一個範例所示),那麼它將嘗試在內部重寫請求(而不是外部重定向),因此可見 URL 將不會變更。

請嘗試在根文件頂部附近執行以下操作.htaccess

RewriteEngine On

RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]

上面的狀態...對於所有具有或(完全)(.*)查詢字串的URL ,然後重定向到相同的 URL 路徑並丟棄查詢字串(- 查詢字串丟棄)。這是 Apache 2.4 的新功能(我假設您正在使用它)。如果省略該標誌,那麼您將獲得一個重定向循環(因為查詢字串將重新附加到重定向的 URL)。mode=listmode=gridQSDQSDQSD

注意上面的內容符合查詢字串確切地(如您的範例所示)。如果查詢字串中存在任何其他 URL 參數或大小寫不同,則將無法配對。

請注意,這是 302(臨時)重定向。只有當您確認其工作正常時,才將其更改為 301(永久)(如果這是意圖)。 301 由瀏覽器持久緩存,因此可能會為測試帶來問題。

參考:

相關內容