RewriteRule删除查询字符串

时间:2016-05-14 13:48:33

标签: regex mod-rewrite

.htaccess中,我需要删除查询字符串

?lang=ca, from ca/blog/?lang=ca

以另一种方式说,我想重定向:

www.example.com/ca/blog/?lang=ca  

www.example.com/ca/blog/

这是我尝试过的两件不同的事情:

RewriteRule ^ca/blog/ /ca/blog/? [L,R=301]
RewriteRule ^ca/blog/$ /ca/blog/ [QSD]

我的选择有什么问题,以及如何做到这一点?

ca/blog/?lang=ca不存在。这就是为什么现在我需要重定向到ca/blog/。如果我不重定向Google,请认为这是两个不同的页面)

该文档说明了如何删除查询字符串:

https://wiki.apache.org/httpd/RewriteQueryString

但我不知道如何申请我的案件或我尝试的不起作用

我的第二个解决方案使用标志[QSD]查询字符串丢弃。可能有一些我不理解的东西,因为它不起作用

3 个答案:

答案 0 :(得分:0)

一开始检查是否

LoadModule rewrite_module modules/mod_rewrite.so

httpd.conf文件中取消注释。当apache运行时检查:

httpd -M | grep rewrite

验证mod_rewrite确实已启用。一旦满足这些条件,下面的东西就可以了。

网址损坏:

http://www.example.com/ca/blog/?lang=ca

<强>规则

RewriteEngine    On
RewriteCond      %{QUERY_STRING}    ^lang=ca$
RewriteRule (.*)/  $1/? [R=permanent]

服务器将获取此

http://www.example.com/ca/blog/

<强>解释

  1. RewriteCond中,我们检查查询字符串lang是否为ca

  2. 如果条件满足,我们在末尾附加一个空查询字符串?。由于您的原始网址已损坏,我们将R=permanent告诉服务器重定向是永久性的。

答案 1 :(得分:0)

查询字符串不是您在重写规则中匹配的内容的一部分。如果要匹配查询字符串中的任何内容,则需要RewriteCond指令,将下一个RewriteRule限制为您指定的条件。

例如:

RewriteCond lang=cr %{QUERY_STRING}
RewriteRule ^/foo /foo [R=301]

这会将/foo?lang=cr重定向到/foo,但/foo?lang=en/foo将不受影响。

当然,模式可能需要更严格一些,因为它也会匹配/foo?langlang=crown,但仍然......

顺便说一句,在应用程序逻辑中实现它可能更容易,而不是在.htaccess中实现....

答案 2 :(得分:0)

您可以在根目录中使用此规则.htaccess:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^lang= [NC]
RewriteRule ^(ca/blog/?)$ %{REQUEST_URI}? [NC,L,R=301]