开发者

Case Insensitive URLs with mod_rewrite

开发者 https://www.devze.com 2022-12-15 04:23 出处:网络
I\'d like for any url that doesn\'t hit an existing file, to do a lookup on the other possible cases and see if those files exist, and if so, 302 to them.

I'd like for any url that doesn't hit an existing file, to do a lookup on the other possible cases and see if those files exist, and if so, 302 to them.

If 开发者_如何学Pythonthat's not possible, then I'm ok with these compromises:

  • Only check the lowercase version
  • Only check the first path portion

For example http://example.com/CoOl/PaTH/CaMELcaSE should redirect to http://example.com/cool/path/camelCase (assuming the latter exists).

but of course a full solution is much more useful to me and others


CheckSpelling on

Matches files and directories. See the documentation for details.


I don't have Apache handy to test, but some combination of these rules should do what you want:

RewriteEngine on
RewriteMap lower int:tolower
RewriteCond ${lower:%{REQUEST_URI}} -U
RewriteRule [A-Z] ${lower:%{REQUEST_URI}} [R=302,L]
  • A lowercase map to convert /SoMeThinG to /something
  • A condition to see if the lowercase of the REQUEST_URI exists (-U is internal apache query)
  • The rule to actually do the rewrite

I don't know if the RewriteMap can be applied in a condition, or if it only applies to a rule. These are based on experts exchange accepted answer and a small orange forum discussion.

Your "ideal" solution is probably not possible unless you can enumerate every valid page on your site. If you only have a few valid pages, a combination of RewriteMap and a text map will do exactly what you need. If there are hundreds / thousands of pages you may need to write a script and use the prg directive.

If you can't identify every valid page, you would need to try every variant in case. Consider your URL as a binary string, with 0 for lowercase letter and 1 for uppercase. Just from your simple example you'd have to test 2^17 variations, 128k pages.


Look up the Apache module mod_negotiation. It does exactly what you want: http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews

You can also pipe all requests to a single PHP file and let the PHP file do the checking for you.

0

精彩评论

暂无评论...
验证码 换一张
取 消