删除尾随时重定向有趣的事情?

时间:2013-01-23 00:28:50

标签: regex apache .htaccess mod-rewrite url-rewriting

所以我一直在努力摆脱尾随?在网址上避免SEO重复。基本上我有一个像

的网址

www.example.com/some/thing?

我需要将其重定向到

www.example.com/some/thing

我的htaccess上有以下内容:

# Remove trailing ?
RewriteCond %{REQUEST_METHOD} (GET) [NC]
RewriteCond %{THE_REQUEST} \?\ HTTP [NC] 
#RewriteRule ([a-zA-Z0-9-/.=&:?]*)\?$ $1 [R=301,L]
RewriteRule ^(.*)$ $1 [r=301,l]

我使用测试仪在第4行测试了我的正则表达式,它可以与整个网址完美配合。 然后我操纵htacces尝试看看变量THE_REQUEST返回什么,我注意到我的代码工作但是有些错误。这是我在rewrite.log中使用上面的代码得到的:

127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (2) init rewrite engine with requested uri /some/thing
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (3) applying pattern '^(.*)$' to uri '/some/thing'
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (4) RewriteCond: input='GET' pattern='(GET)' [NC] => matched
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (4) RewriteCond: input='GET /some/thing? HTTP/1.1' pattern='\?\ HTTP' [NC] => matched
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (2) rewrite '/some/thing' -> '/some/thing'
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (2) explicitly forcing redirect with http://www.example.com/some/thing
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (1) escaping http://www.example.com/some/thing for redirect
127.0.0.1 - - [22/Jan/2013:16:08:09 --0800] [www.example.com/sid#2cb480][rid#eb90f8/initial] (1) redirect to http://www.example.com/some/thing? [REDIRECT/301]

根据我对日志的理解,它正确地重定向,但由于某种原因,在重定向时重写后在最后添加问号。 关于什么事情以及如何解决这个问题的想法?

此外,当我通过取消注释第4行和注释第5行来“解除”它时,apache不遵循规则,因为它正在测试/ some / string而不是针对整个URL(URI + QUERY)。如何在RewriteRule而不仅仅是URI上对整个URL进行apache检查?

注意:网址是动态的,因此我无法对重定向进行硬编码。

1 个答案:

答案 0 :(得分:0)

来自RewriteRule Directive

  

修改查询字符串
  ...
  如果要删除现有查询字符串,请仅使用问号结束替换字符串   ...

所以你必须附加一个?

RewriteRule .* http://www.example.com/$0? [R,L]

永远不要在启用301的情况下进行测试,请参阅此回答Tips for debugging .htaccess rewrite rules