【问题标题】:Trying to fix double-encoding in htaccess尝试修复 htaccess 中的双重编码
【发布时间】: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 行合并为一个。

标签: apache .htaccess


【解决方案1】:

我找到了一个部分解决方案,这对我的目的来说已经足够了。基于 regilero 的 cmets,我决定删除 {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,正确)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多