试图在htaccess中修复双重编码

时间:2013-08-23 01:51:00

标签: apache .htaccess

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

当前档案:

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],则生成的网址会被双重编码:

  • 浏览器: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强制使用小写,因为之前的网站是大小写混合的,需要管理的组合太多了。花了一整天审查线程,但似乎无法隔离问题..或者我可能正在以错误的方式看待这个问题。

谢谢。

1 个答案:

答案 0 :(得分: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,更正)

我需要全站小写的原因是由于之前的网站结构 - 上面的数组是一个从未被编入索引的功能(由于规范链接),所以我可以使用一个混合大小写的查询。

我希望这有助于其他人!