.htaccess无末尾斜杠URL跳转异常:错误跳转到服务器绝对路径
.htaccess异常重定向问题修复方案
问题根因
你遇到的畸形跳转问题由3个配置疏漏共同导致:
- Apache默认的
mod_dir模块行为和重写规则顺序冲突:当请求不带末尾斜杠的路径对应存在的目录时,mod_dir会默认在你的重定向规则执行前自动跳转到带斜杠的路径,此时会把服务器本地文件系统路径拼入跳转URL,就会出现你看到的/var/www/vhosts/example.com/httpdocs/这类路径。 - HTTPS条件写法不严谨:你写的
RewriteCond %{HTTPS}s ^on(s)|匹配逻辑错误,也没有用到捕获的分组,直接导致跳转URL里出现httpss的多余s字符。 - 重定向规则缺少必要的标记,且重复开启了两次
RewriteEngine On,规则优先级混乱。
修复后的完整配置
<IfModule mod_rewrite.c> RewriteEngine On # 强制HTTPS+统一域名前缀,放在所有规则最前面 RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{HTTPS} !=on # 如果不需要www前缀,把下面目标里的www.删掉即可 RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] # 非文件路径统一补末尾斜杠,避免mod_dir触发路径拼接 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^.]*[^/])$ https://%{HTTP_HOST}/$1/ [R=301,L,NE] # 隐藏.html后缀 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^([^/]+)/?$ $1.html [L] # 隐藏.php后缀 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^([^/]+)/?$ $1.php [L] # 拦截libwww-perl爬虫 RewriteCond %{HTTP_USER_AGENT} libwww-perl.* RewriteRule .* ? [F,L] </IfModule>
注意事项
修改配置后需要清空浏览器缓存再测试,因为301是永久重定向,浏览器会默认缓存旧的跳转结果。
内容的提问来源于stack exchange,提问作者Razarach
相关产品推荐
相关产品推荐

