【问题标题】:interesting thing with redirect when removing trailing?删除尾随时重定向的有趣之处?
【发布时间】:2013-01-23 00:28:50
【问题描述】:

所以我一直在努力摆脱尾随?在 url 上以避免 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 行测试了我的正则表达式,它与整个 url 完美配合。 然后我操纵了 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]

根据我对日志的理解,它正在正确重定向,但由于某种原因,它在重定向时在 rewriterule 之后的末尾附加了问号。 关于发生了什么以及如何解决这个问题的任何想法?

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

注意:网址是动态的,所以我不能硬编码重定向。

【问题讨论】:

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


    【解决方案1】:

    来自RewriteRule Directive

    修改查询字符串
    ...
    当您想删除现有的查询字符串时,只用问号结束替换字符串。
    ...

    所以你必须附加一个?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多