評論這裏我們重寫原始請求將自己與一個空的查詢字符串,如果查詢字符串是不是空的。
RewriteEngine On
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.*)$ $1?
這已經包括了Apache,雖然與[QSD] Query String Discard
:
RewriteRule ^(.*)$ $1 [QSD]
注:查詢字符串允許你跟蹤各種各樣的東西在日誌文件中,並從外部來源的鏈接。這樣做會限制這些選項。
這可能不是你想要做的(通過這種方式失去了很多舊的鏈接)。所以,以下是如何將舊的查詢字符串重定向到新的URL作爲301重定向。這對於那些不熟悉RegEx或者Apache工作方式的人來說會有點混淆。在字符串的第一部分以問號結束意味着「也許是前面的字符」。在這種情況下,我們在替換結束時添加了?
(不是REGEX模式),因爲根據Apache manual for the QSD flag,Apache的默認行爲類似於[QSA]
(查詢字符串附加)。因此,單獨添加單個?
正在創建一個空查詢字符串以使現有字符串無效。在StackOverflow上有幾個使用這種方法的答案。
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule .* %1/? [R=301,L]
使用[QSD]
你可以這樣寫:
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule .* %1/ [R=301,L,QSD]
你的另一場比賽中需要像contact.php
文件並將其重定向到/contact/
。這也可能仍然有效。
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule ^(.+)\.php$ /$1/? [R=301,L]
這條規則也與QSD寫成:
RewriteRule ^(.+)\.php$ /$1/ [R=301,L,QSD]
QSA代表查詢字符串追加... – Clive
URL的查詢字符串部分不能被改寫,它會被添加到無論你做什麼,重寫的URL的新查詢字符串。 URL重寫意味着反過來工作。 – Alasdair
@Alasdair:這只是部分真實的,如果你在'?'中進行重寫,它應該刪除查詢字符串。有關詳細信息,請參閱此博客文章:http://www.simonecarletti.com/blog/2009/01/apache-rewriterule-and-query-string/ – Wolph