案例不敏感的URL与mod_rewrite

时间:2010-01-04 08:14:28

标签: apache url mod-rewrite

我想要任何没有点击现有文件的网址,对其他可能的情况进行查找并查看这些文件是否存在,如果存在,则为302。

如果那是不可能的,那么我对这些妥协感到满意:

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

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

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

3 个答案:

答案 0 :(得分:20)

CheckSpelling on

匹配文件和目录。有关详细信息,请参阅documentation

答案 1 :(得分:4)

我没有Apache方便测试,但这些规则的某些组合应该做你想要的:

RewriteEngine on
RewriteMap lower int:tolower
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页。

答案 2 :(得分:0)

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

您还可以将所有请求传递给单个PHP文件,并让PHP文件为您进行检查。