【问题标题】:rewrite uppercase url to lowercase url htaccess将大写 url 重写为小写 url htaccess
【发布时间】:2020-08-07 22:46:30
【问题描述】:

我希望将包含大写字符的网址重定向到小写网址。不幸的是,我无权访问 httpd.config 文件。所以我尝试了这种方法来用 htaccess 文件重写 url:http://www.askapache.com/htaccess/rewrite-uppercase-lowercase.html。但是它添加了额外的 / 因为它是一个循环,并且当 url 包含两个以上的部分(例如 www.mysite.com/part1/part2/part3/ )时它也不起作用(504 错误)

我该如何解决这个问题,或者有其他/更好的方法吗?

【问题讨论】:

    标签: php apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    如果您查看您的 Apache 错误日志(这很可能是由于这件事造成的),您应该会看到以下内容:

    [Sun Dec 08 09:46:28.884713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] strip per-dir prefix: C:/wamp/www/AAA/AA -> AAA/AA
    [Sun Dec 08 09:46:28.884713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] applying pattern '[A-Z]' to uri 'AAA/AA'
    [Sun Dec 08 09:46:28.884713 2013] [rewrite:trace5] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] setting env variable 'HASCAPS' to 'TRUE'
    [Sun Dec 08 09:46:28.884713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] add path info postfix: C:/wamp/www/AAA -> C:/wamp/www/AAA/AA
    [Sun Dec 08 09:46:28.885713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] strip per-dir prefix: C:/wamp/www/AAA/AA -> AAA/AA
    [Sun Dec 08 09:46:28.885713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] applying pattern '^([^A]*)A(.*)$' to uri 'AAA/AA'
    [Sun Dec 08 09:46:28.885713 2013] [rewrite:trace2] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] rewrite 'AAA/AA' -> 'aAA/AA'
    [Sun Dec 08 09:46:28.885713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] add per-dir prefix: aAA/AA -> C:/wamp/www/aAA/AA
    [Sun Dec 08 09:46:28.885713 2013] [rewrite:trace3] [pid 4860:tid 1532] mod_rewrite.c(468): [client ::1:50143] ::1 - - [localhost/sid#56cb48][rid#1642140/initial] [perdir C:/wamp/www/] add path info postfix: C:/wamp/www/aAA/AA -> C:/wamp/www/aAA/AA/AA
    

    一切顺利,直到应用路径信息后缀。我不确定为什么,但我知道将DPI 标志应用于将大写转换为小写的 26 个 RewriteRules 很可能会解决您的问题。

    # If there are caps, set HASCAPS to true and skip next rule
    RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
    
    # Skip this entire section if no uppercase letters in requested URL
    RewriteRule ![A-Z] - [S=28]
    
    # Replace single occurance of CAP with cap, then process next Rule.
    RewriteRule ^([^A]*)A(.*)$ $1a$2 [DPI]
    RewriteRule ^([^B]*)B(.*)$ $1b$2 [DPI]
    RewriteRule ^([^C]*)C(.*)$ $1c$2 [DPI]
    RewriteRule ^([^D]*)D(.*)$ $1d$2 [DPI]
    RewriteRule ^([^E]*)E(.*)$ $1e$2 [DPI]
    RewriteRule ^([^F]*)F(.*)$ $1f$2 [DPI]
    RewriteRule ^([^G]*)G(.*)$ $1g$2 [DPI]
    RewriteRule ^([^H]*)H(.*)$ $1h$2 [DPI]
    RewriteRule ^([^I]*)I(.*)$ $1i$2 [DPI]
    RewriteRule ^([^J]*)J(.*)$ $1j$2 [DPI]
    RewriteRule ^([^K]*)K(.*)$ $1k$2 [DPI]
    RewriteRule ^([^L]*)L(.*)$ $1l$2 [DPI]
    RewriteRule ^([^M]*)M(.*)$ $1m$2 [DPI]
    RewriteRule ^([^N]*)N(.*)$ $1n$2 [DPI]
    RewriteRule ^([^O]*)O(.*)$ $1o$2 [DPI]
    RewriteRule ^([^P]*)P(.*)$ $1p$2 [DPI]
    RewriteRule ^([^Q]*)Q(.*)$ $1q$2 [DPI]
    RewriteRule ^([^R]*)R(.*)$ $1r$2 [DPI]
    RewriteRule ^([^S]*)S(.*)$ $1s$2 [DPI]
    RewriteRule ^([^T]*)T(.*)$ $1t$2 [DPI]
    RewriteRule ^([^U]*)U(.*)$ $1u$2 [DPI]
    RewriteRule ^([^V]*)V(.*)$ $1v$2 [DPI]
    RewriteRule ^([^W]*)W(.*)$ $1w$2 [DPI]
    RewriteRule ^([^X]*)X(.*)$ $1x$2 [DPI]
    RewriteRule ^([^Y]*)Y(.*)$ $1y$2 [DPI]
    RewriteRule ^([^Z]*)Z(.*)$ $1z$2 [DPI]
    
    # If there are any uppercase letters, restart at very first RewriteRule in file.
    RewriteRule [A-Z] - [N]
    
    RewriteCond %{ENV:HASCAPS} TRUE
    RewriteRule ^/?(.*) /$1 [R,L]
    

    有关DPI 标志的更多信息可以在here 找到,mod_rewrite 的一般文档可以在here 找到。

    【讨论】:

    • @theblackpost 邀请您以更好的解决方案来回答。经过 7 年的事后看来,我可能会建议消耗将请求发送到 php 的成本,并在那里重写 url,但除此之外,我认为对于这个问题没有比这里写的更好的解决方案。
    • Ок,需要虚拟主机访问权限。解决方案如下
    【解决方案2】:

    在 VirtualHosts 站点目录(已启用站点)

    RewriteEngine On
    RewriteMap lowercase int:tolower 
    

    在 .htaccess:

    RewriteCond $1 [A-Z]
    RewriteRule ^(.*)$ /${lowercase:$1} [R=301,L]
    

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 2012-11-19
      • 2016-05-23
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2017-05-28
      • 2011-04-07
      • 2013-07-18
      相关资源
      最近更新 更多