如何借助.htaccess仅在URL不存在时将其转换为小写?
解决.htaccess仅对不存在的URL转小写的问题
你的需求是:仅当站点上不存在对应URL时,才将URL中的所有字符转换为小写,但当前代码会把已存在的URL也转成小写——问题出在规则执行顺序:原代码先完成了URL转小写,再判断资源是否存在,此时判断的是转小写后的路径,而非用户请求的原路径。
正确的做法是先判断原请求的URL对应的资源是否存在,如果存在就直接放行,不触发转小写逻辑;只有当资源不存在时,才执行转小写并跳转。
修正后的完整代码如下:
RewriteEngine On # 先判断:如果当前请求的文件或目录存在,直接跳过所有转小写规则 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 以下是原有的转小写规则链 RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1] RewriteRule ![A-Z] - [S=28] 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 RewriteRule [A-Z] - [N] RewriteCond %{ENV:HASCAPS} TRUE RewriteRule ^/?(.*) /$1 [R=301,L]
关键修改说明
- 新增的前三条规则:先检查用户请求的
REQUEST_FILENAME对应的文件或目录是否存在,只要存在就用[L]标记结束规则处理,直接返回资源,不会进入后面的转小写流程。 - 原有的转小写规则链仅在资源不存在时才会执行,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user1621015
相关产品推荐
相关产品推荐

