【问题标题】:Case Insensitive URLs with mod_rewrite带有 mod_rewrite 的不区分大小写的 URL
【发布时间】:2011-01-01 04:10:03
【问题描述】:

我想要任何没有命中现有文件的 url,以查找其他可能的情况并查看这些文件是否存在,如果存在,则向它们发送 302。

如果这不可能,那么我可以接受这些妥协:

  • 只检查小写版本
  • 只检查第一个路径部分

例如http://example.com/CoOl/PaTH/CaMELcaSE 应该重定向到http://example.com/cool/path/camelCase(假设后者存在)。

当然,完整的解决方案对我和其他人更有用

【问题讨论】:

  • 我宁愿使用 301 而不是 302。

标签: apache url mod-rewrite


【解决方案1】:

查找 Apache 模块 mod_negotiation。它完全符合您的要求: http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews

您还可以将所有请求通过管道传输到单个 PHP 文件,并让 PHP 文件为您进行检查。

【讨论】:

  • 这很接近,但似乎主要用于添加扩展。就像对foo 的请求变成foo.xmlfoo.html。我正在尝试修正错别字。
【解决方案2】:

我没有 Apache 方便测试,但是这些规则的一些组合应该可以满足您的需求:

重写引擎开启 RewriteMap lower int:tolow RewriteCond ${lower:%{REQUEST_URI}} -U RewriteRule [A-Z] ${lower:%{REQUEST_URI}} [R=302,L]
  • 将 /SoMeThinG 转换为 /something 的小写映射
  • 判断 REQUEST_URI 小写是否存在的条件(-U 是内部 apache 查询)
  • 实际进行重写的规则

我不知道 RewriteMap 是否可以应用在一个条件中,或者它是否只适用于一个规则。这些基于experts exchange accepted answera small orange forum discussion

除非您可以枚举您网站上的每个有效页面,否则您的“理想”解决方案可能是不可能的。如果您只有几个有效页面,RewriteMap 和文本地图的组合将完全满足您的需求。如果有成百上千的页面,您可能需要编写脚本并使用prg 指令。

如果您无法识别每个有效页面,则需要尝试每个变体以防万一。将您的 URL 视为二进制字符串,小写字母为 0,大写字母为 1。仅从您的简单示例中,您就必须测试 2^17 个变体,128k 个页面。

【讨论】:

    【解决方案3】:
    CheckSpelling on
    

    匹配文件和目录。详情请见documentation

    【讨论】:

    • 是否有更新版本的等效版本?
    • 好像不是这样的;我有 Ubuntu 12.04 LTS、Apache 2.2.22 并在 $APACHE/mods-enabled/ 中创建指向 speling.load 和 speling.conf 的符号链接似乎不允许使用错误大小写的文件夹名称。 (当然,speling.load 和 speling.conf 已经设置好了……也许我应该再发一个问题。)
    • 好的。是我对符号链接很傻。问题解决了。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多