我在对包含大写字母到小写的 URL 执行 301 重定向时遇到问题,但不包括静态文件(PDF/CSS/JS/JPEG/JPG/PNG/WEBP...等)。例如:
https://www.example.com/Page/
会成为
https://www.example.com/page/
但https://www.example.com/Clear_IMAGE.png
不会改变。
在我的 VirtualHost conf 文件中:
RewriteMap lc int:tolower
在我的.htaccess
:
RewriteRule ^/(.*)$ /${lc:$1} !^(pdf|js|css|png|jpg|jpeg|webp)
但是这对我的 URL 没有任何影响。
答案1
RewriteRule ^/(.*)$ /${lc:$1} !^(pdf|js|css|png|jpg|jpeg|webp)
你说这“没有任何效果”,然而,这在语法上是无效的(“坏标志参数”),并且应该500 内部服务器错误导致中断!?如果没有,那么可能还有其他更根本的问题吗?
然而,这还存在其他问题:
- 在 中
.htaccess
,匹配的 URL 路径RewriteRule
图案不以斜线开头。 lc
如果源请求包含大写字母,则仅应将 URL 改为小写(即调用重写映射),否则自然会出现重定向循环。- 正则
^(pdf|js|css|png|jpg|jpeg|webp)
表达式匹配的字符串是开始使用这些字符。您需要(否定)匹配以点 + 文件扩展名结尾的字符串。
请尝试以下操作:
RewriteCond %{REQUEST_URI} !\.(pdf|js|css|png|jpe?g|webp)$ [NC]
RewriteRule [A-Z] ${lc:%{REQUEST_URI}} [R=301,L]
.htaccess
请注意,这必须放在文件顶部附近前WordPress 代码块。即在# BEGIN WordPress
注释标记之前。
这RewriteRule
图案 [A-Z]
只是测试 URL 路径中至少有 1 个大写字母。
这状况(RewriteCond
指令)排除以任何所述文件扩展名结尾的 URL(不区分大小写)。
请注意,REQUEST_URI
服务器变量已包含斜杠前缀,因此从开头省略了该前缀代换细绳。
注意:首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。
您无需排除(不断增长的)已知文件类型列表,而是可以简单地排除任何看起来具有文件扩展名的请求。(假设您的 WordPress 页面 URL 没有文件扩展名。)例如,URL 路径末尾有一个点,后面跟着 2 到 4 个字母/数字。例如:
RewriteCond %{REQUEST_URI} !\.\w{2,4}$
:
由于简写字符类已经包含大写和小写字母,NC
因此这里不需要该标志。\w