【发布时间】:2013-08-23 01:50:59
【问题描述】:
使用.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 小写,因为以前的站点是混合大小写的,需要管理的组合太多。花了一整天的时间审查线程,但似乎无法隔离问题..或者我可能以错误的方式看待这个问题。
谢谢。
【问题讨论】:
-
奇怪:RewriteMap 通常在 .htaccess 范围内不可用,有效范围是:
server config, virtual host,所以在实际配置文件中而不是在动态 .htaccess 文件中。 -
我将 RewriteMap 添加到 httpd.conf(只是试图提供尽可能多的细节)-“RewriteMap lc int:tolower”。小写效果很好,我只需要排除编码字符。
-
有趣的问题。我知道查询字符串不是 url 解码的,而 REQUEST URI 是。可能相当复杂。您知道 Googlebot 在哪里找到他的源网址吗?也许你有一个带有双 url 编码的糟糕的 sitemap.xml?
-
希望它是一个糟糕的站点地图 - 我正在 WMT 中使用 fetch as google 测试源 URL(这会产生一个循环 301)。我想从 url 中删除 [],这将消除这个问题,但这超出了我的范围。我几乎用 .htaccess.. 估计问题与 2 次重写有关,但不知道如何将第 3 行和第 4 行合并为一个。