【问题标题】:Use htaccess to redirect to lower case version of the same URL使用 htaccess 重定向到相同 URL 的小写版本
【发布时间】:2021-01-19 10:12:21
【问题描述】:

我查看了其他答案,但似乎无法正确解决这个问题,我也尝试了 mod_speling,但似乎无法解决它

have this previous rule 运行良好并且会正常 301,但是服务器会给小写版本一个 303(如果有大写字母)

所以如果 url 都是小写的很好,如果不是,它将 301 到正确的 url 大写,然后 303 到最终的 url 全部小写。我试图摆脱 303 并使其成为 301。

是否可以将此规则重定向到 URL 的小写版本,或者可能需要新规则?

^(this-is-static/[a-zA-Z-]+)_([^/]+)$ /$1/$2 [R=301,L]

【问题讨论】:

    标签: regex apache .htaccess redirect centos


    【解决方案1】:

    要完全在.htaccess 中执行此操作(不推荐),这应该放在.htaccess 文件的最顶部。至少它应该高于任何其他RewriteRules。那是因为这使用了一个循环,直到没有更多的大写字符可以转换,它会一直从第一个HASCAPS:TRUE RewriteRule开始。

    RewriteEngine On
    RewriteBase /
    
    # 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
    RewriteRule ^([^B]*)B(.*)$ $1b$2
    RewriteRule ^([^C]*)C(.*)$ $1c$2
    RewriteRule ^([^D]*)D(.*)$ $1d$2
    RewriteRule ^([^E]*)E(.*)$ $1e$2
    RewriteRule ^([^F]*)F(.*)$ $1f$2
    RewriteRule ^([^G]*)G(.*)$ $1g$2
    RewriteRule ^([^H]*)H(.*)$ $1h$2
    RewriteRule ^([^I]*)I(.*)$ $1i$2
    RewriteRule ^([^J]*)J(.*)$ $1j$2
    RewriteRule ^([^K]*)K(.*)$ $1k$2
    RewriteRule ^([^L]*)L(.*)$ $1l$2
    RewriteRule ^([^M]*)M(.*)$ $1m$2
    RewriteRule ^([^N]*)N(.*)$ $1n$2
    RewriteRule ^([^O]*)O(.*)$ $1o$2
    RewriteRule ^([^P]*)P(.*)$ $1p$2
    RewriteRule ^([^Q]*)Q(.*)$ $1q$2
    RewriteRule ^([^R]*)R(.*)$ $1r$2
    RewriteRule ^([^S]*)S(.*)$ $1s$2
    RewriteRule ^([^T]*)T(.*)$ $1t$2
    RewriteRule ^([^U]*)U(.*)$ $1u$2
    RewriteRule ^([^V]*)V(.*)$ $1v$2
    RewriteRule ^([^W]*)W(.*)$ $1w$2
    RewriteRule ^([^X]*)X(.*)$ $1x$2
    RewriteRule ^([^Y]*)Y(.*)$ $1y$2
    RewriteRule ^([^Z]*)Z(.*)$ $1z$2
    
    # If there are any uppercase letters, restart at very first RewriteRule in file.
    RewriteRule [A-Z] - [N]
    
    RewriteCond %{ENV:HASCAPS} TRUE
    RewriteRule ^/?(.*) /$1 [R=301,L]
    

    这样做的更好方法,但它必须在 httpd.conf 文件中,而不是 .htaccess

    RewriteEngine on
    RewriteBase /
    RewriteMap lowercase int:tolower
    RewriteCond $1 [A-Z]
    RewriteRule ^/?(.*)$ /${lowercase:$1} [R=301,L]
    

    您确定您在httpd.conf 中正确使用了mod_speling 吗?

    <IfModule mod_speling.c>
    CheckCaseOnly On
    CheckSpelling On
    </IfModule>
    

    【讨论】:

    • 谢谢你,但是当我在 ssl.conf 中尝试 mod speling 时,htaccess 代码给出了 500 错误(似乎这就是我的服务器的设置方式)我在重新启动 apache 时收到此错误“RewriteBase:仅在每个目录的配置文件中有效"
    • 然后删除RewriteBase
    • 谢谢,这适用于稍微修改的版本
    • 你做了什么修改?
    • 我从这里使用了 .conf 的规则serverfault.com/a/177653/587418
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 2021-10-06
    • 1970-01-01
    • 2016-05-23
    • 2021-04-13
    • 2017-12-04
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多