為了我的問題,我檢查了很多。有一些接近,但沒有一個可以解決我的問題。
我需要永久重定向所有以此結尾的 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=list
mode=grid
QSD
QSD
QSD
注意上面的內容符合查詢字串確切地(如您的範例所示)。如果查詢字串中存在任何其他 URL 參數或大小寫不同,則將無法配對。
請注意,這是 302(臨時)重定向。只有當您確認其工作正常時,才將其更改為 301(永久)(如果這是意圖)。 301 由瀏覽器持久緩存,因此可能會為測試帶來問題。
參考: