.htaccess 301 重定向 URL 忽略其參數
文件重定向
Redirect 301 /products.php http://example.com/product_123.php
和域重定向
Redirect 301 / http://www.example.com/
很容易。但是,我想重定向一些忽略所有參數的 URL,即
example.com/slug1/slug2/slug3?pagination=1 example.com/slug1/slug2/slug3?ref=2 example.com/slug1/slug2/slug3?day=Monday example.com/slug1/slug2/slug3?referer=Google example.com/slug1/slug2/slug3?referer=Facebook ... etc
都應該重定向到
example.com/slug4
這就是您應該使用
RedirectMatch
帶有正則表達式匹配的指令而不是普通的Redirect
.也許是這樣的:
RedirectMatch 301 "/slug1/slug2/slug3(.*)$" "/slug4"
如果您想簡單地忽略所有參數,那麼您仍然可以使用標準
Redirect
,因為它是前綴匹配並且無論如何都不匹配查詢字元串。例如:Redirect 301 /slug1/slug2/slug3 /slug4
以上
Redirect
將 301 重定向問題中的所有 URL(即所有以 開頭的 URL/slug1/slug2/slug3
)到/slug4
.但是,所請求 URL 上的任何查詢字元串也將原封不動地傳遞到目標 URL。因此,
/slug1/slug2/slug3?ref=2
將被重定向到/slug4?ref=2
. 如果這是不可取的,並且您希望完全刪除查詢字元串*1,那麼您將需要使用 mod_rewrite (即。RewriteRule
),而不是 mod_alias (即。Redirect
或RedirectMatch
,如另一個答案中所建議的)以顯式刪除完全來自目標 URL 的查詢字元串。例如:RewriteEngine On RewriteRule ^slug1/slug2/slug3$ /slug4? [R=301,L]
?
替換末尾的將RewriteRule
導致從目標 URL 中刪除查詢字元串(您也可以QSD
在 Apache 2.4+ 上使用該標誌)。RewriteRule
查詢字元串與模式不匹配,所以這方面不需要額外做,除非需要匹配特定的查詢字元串,或者只有在實際存在查詢字元串時(無論是否查詢字元串是否存在)。切換到 mod_rewrite 重定向的另一個警告是,理想情況下,您應該將任何現有的 mod_alias 重定向更改為等效的 mod_rewrite 語法。這是為了避免任何潛在的衝突,因為這兩個模組在不同的時間執行。
*1請注意,您可以or指令
?
在目標 URL 的末尾簡單地附加一個(即空查詢字元串)但是,尾隨指令那樣被完全刪除Redirect``RedirectMatch``?``RewriteRule