2

使用 .htaccess,是否可以将 url 转换为小写,但允许大写编码?

当前文件:

RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].* [OR]
RewriteCond %{QUERY_STRING} ^[^A-Z]*[A-Z].* 
RewriteRule ^ ${lc:%{REQUEST_URI}}?${lc:%{QUERY_STRING}} [L,NE,R=301]
RewriteRule ^client/(.*) client.php?q=type:$1 [QSA]
  • 浏览器:domain.com/client/city?mf[]=liverpool(正确)
  • Googlebot:domain.com/client/city?mf%5d%5b=liverpool(301,不正确)

如果我删除 [NE],则生成的 url 是双重编码的:

  • 浏览器:domain.com/client/city?mf%255b%255d=liverpool(200,但结果不正确)
  • Googlebot:domain.com/client/city?mf%255b%255d=liverpool(200,但结果不正确)

期望的输出:

  • 浏览器:domain.com/client/city?mf[]=liverpool(正确)
  • Googlebot:domain.com/client/city?mf%5D%5B=liverpool(200,正确)

我强制使用 RewriteMap 小写,因为以前的站点是混合大小写的,需要管理的组合太多。花了一整天的时间审查线程,但似乎无法隔离问题..或者我可能以错误的方式看待这个问题。

谢谢你。

4

1 回答 1

0

我找到了一个部分解决方案,这对我的目的来说已经足够了。根据 regilero 的评论,我决定删除 {QUERY_STRING} 的 RewriteCond。这是新代码:

RewriteRule ^client/(.*) client.php?q=type:$1 [QSA]
RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].*
RewriteRule ^ ${lc:%{REQUEST_URI}} [L,R=301]

上述结果如下:

  • 浏览器:domain.com/client/city?mf[]=Liverpool(正确)
  • Googlebot:domain.com/client/city?mf%5D%5B=Liverpool(200,正确)

我在站点范围内需要全部小写的原因是由于以前的站点结构 - 上面的数组是一个从未被索引的功能(由于规范链接),所以我可以接受混合大小写的查询。

我希望这对其他人有帮助!

于 2013-08-23T20:13:08.920 回答