带有 mod_rewrite 的不区分大小写的 URL
Posted
技术标签:
【中文标题】带有 mod_rewrite 的不区分大小写的 URL【英文标题】:Case Insensitive URLs with mod_rewrite 【发布时间】:2011-01-01 04:10:03 【问题描述】:我想要任何没有命中现有文件的 url,以查找其他可能的情况并查看这些文件是否存在,如果存在,则向它们发送 302。
如果这不可能,那么我可以接受这些妥协:
只检查小写版本 只检查第一个路径部分例如http://example.com/CoOl/PaTH/CaMELcaSE 应该重定向到http://example.com/cool/path/camelCase(假设后者存在)。
当然,完整的解决方案对我和其他人更有用
【问题讨论】:
我宁愿使用 301 而不是 302。 【参考方案1】:查找 Apache 模块 mod_negotiation。它完全符合您的要求: http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews
您还可以将所有请求通过管道传输到单个 php 文件,并让 PHP 文件为您进行检查。
【讨论】:
这很接近,但似乎主要用于添加扩展。就像对foo
的请求变成foo.xml
或foo.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 answer 和a 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 已经设置好了……也许我应该再发一个问题。)
好的。是我对符号链接很傻。问题解决了。以上是关于带有 mod_rewrite 的不区分大小写的 URL的主要内容,如果未能解决你的问题,请参考以下文章
使用 Hibernate Criteria 的不区分大小写的排序
nvarchar 类型的不区分大小写的主键,其中 ß != ss