Case Insensitive URLs with mod_rewrite

后端 未结 3 2143
说谎
说谎 2020-11-27 08:09

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 that\'s

相关标签:
3条回答
  • 2020-11-27 08:24
    CheckSpelling on
    

    Matches files and directories. See the documentation for details.

    0 讨论(0)
  • 2020-11-27 08:34

    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.

    0 讨论(0)
  • 2020-11-27 08:40

    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 讨论(0)
提交回复
热议问题