SSL/WWW重定向时URL为何带托管目录?求修复方案
解决方案:移除重定向URL中的
/dir/路径 你的问题核心是根目录的.htaccess内部转发规则和子目录的重定向规则配合出了问题——内部转发到/dir/后,子目录的重定向规则直接把这个路径暴露在了最终URL里。我们只需要调整两个.htaccess的规则,就能在纯配置层面解决这个问题,完全不用脚本。
1. 调整根目录(public_html/.htaccess)的转发规则
把原来注释的规则替换成下面的内容,确保内部转发到/dir/但不在URL中暴露这个路径:
<IfModule mod_rewrite.c> RewriteEngine On # 内部转发请求到/dir/,URL保持不变 # ------------------------------ RewriteCond %{HTTP_HOST} ^(.*\.)?example\. [NC] RewriteCond %{REQUEST_URI} !^/dir/ RewriteRule ^(.*)$ /dir/$1 [L] </IfModule>
- 用
[L]标记结束当前规则,避免后续规则干扰; - 这里是内部重写,不是外部重定向,所以用户看到的URL不会改变,只是Apache悄悄把请求转到了
/dir/目录处理。
2. 调整子目录(public_html/dir/.htaccess)的重定向规则
修改RewriteBase并调整重定向逻辑,让所有重定向都基于用户实际访问的域名生成,不再带上/dir/:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /dir/ # 移除域名末尾的多余点 # ------------------------------ RewriteCond %{HTTP_HOST} ^(.+?)\.$ RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=302] # 移除URL中的多斜杠 # ------------------------------ RewriteCond %{THE_REQUEST} // RewriteRule ^.*$ $0 [L,NE,R=302] # 给非文件路径添加尾随斜杠 # ------------------------------ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*[^/])$ https://%{HTTP_HOST}/$1/ [L,R=301] # 强制HTTPS # ------------------------------ RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301] # 强制添加WWW前缀 # ------------------------------ RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301] </IfModule>
关键调整说明:
- 设置
RewriteBase /dir/:告诉Apache这个目录的基准路径是/dir/,内部处理时会自动对应这个路径,重定向时不会把它暴露到URL里; - 所有重定向规则都用
%{HTTP_HOST}/$1生成目标URL,完全基于用户实际访问的域名和路径,避免了内部路径泄露; - 简化了尾随斜杠的判断逻辑,减少规则冲突的可能性。
验证效果
现在访问以下任意URL,都会正确重定向到https://www.example.com/(或对应页面的干净URL,完全看不到/dir/):
http://example.comhttps://example.comhttp://www.example.com- 子页面比如
http://example.com/about会重定向到https://www.example.com/about/,内部实际处理的是/dir/about/的内容,但用户完全感知不到这个子目录的存在。
内容的提问来源于stack exchange,提问作者Unexpected Pair of Colons
相关产品推荐
相关产品推荐

