博客迁移后.htaccess重写URL,地址栏显示异常的问题求助
为什么地址栏会显示/www/dist?
核心是Apache的DirectorySlash默认机制在起作用:
当你请求不带末尾斜杠的URL(比如/forza-4-in-c),而这个URL实际对应/www/dist/forza-4-in-c/目录(内部存放index.html),Apache会自动发起外部重定向,把URL补全为带斜杠的版本。这个重定向是在你的Rewrite规则执行之后触发的,所以地址栏就会暴露/www/dist/的真实路径。
而当你请求带斜杠的URL时,服务器不会触发这个补全斜杠的重定向,Rewrite规则的内部转发就能悄悄完成,地址栏自然保持不变。
修复方案
方案1:关闭自动补斜杠(谨慎使用)
在根目录的.htaccess里添加一行:
DirectorySlash Off
这样服务器就不会自动补斜杠发起重定向,但要注意:如果你的博客里有需要通过不带斜杠访问的真实目录,可能会出现资源加载问题,适合纯静态博文、每个内容对应独立目录的场景。
方案2:提前处理无斜杠URL,避免重定向暴露路径
修改Rewrite规则,先把不带斜杠的合法请求重定向到带斜杠的原URL,再内部转发到/www/dist:
RewriteEngine on # 匹配主机域名 RewriteCond %{HTTP_HOST} ^(www\.)?gianlucaghettini\.net$ [NC] # 排除已指向dist目录的请求 RewriteCond %{REQUEST_URI} !^/www/dist/ # 判断dist下对应的路径是否是真实目录 RewriteCond %{DOCUMENT_ROOT}/www/dist%{REQUEST_URI} -d # 重定向到带斜杠的原URL(301是永久重定向,利于SEO) RewriteRule ^(.*[^/])$ /$1/ [R=301,L] # 执行内部转发到dist目录 RewriteCond %{HTTP_HOST} ^(www\.)?gianlucaghettini\.net$ [NC] RewriteCond %{REQUEST_URI} !^/www/dist/ RewriteRule (.*) /www/dist/$1 [L]
这一步会先把/forza-4-in-c重定向到/forza-4-in-c/(地址栏显示原URL),再内部转发到/www/dist/forza-4-in-c/,完全不会暴露真实路径。
方案3:统一使用带斜杠的URL
如果可以批量修改所有外链和博客内部链接,统一用带末尾斜杠的URL(比如https://www.gianlucaghettini.net/forza-4-in-c/),这样服务器不会触发补斜杠的重定向,你的原Rewrite规则就能正常工作,地址栏保持不变。
额外优化:修正原规则的判断条件
原规则里的RewriteCond %{REQUEST_URI} !www/dist/应该加上开头的斜杠,写成!^/www/dist/,否则如果博文URL里恰好包含www/dist字符串,会误判跳过转发,修改后更严谨。
内容的提问来源于stack exchange,提问作者Gianluca Ghettini

