Apache2环境下无需修改页面href实现根相对链接指向site子目录的方案问询
Apache2 实现方案
方案1:mod_substitute 自动替换页面链接(推荐)
该方案无需修改任何页面代码、也无需额外跳转,Apache 在返回 /site 路径下的页面内容时,会自动把所有 href="/ 开头的链接替换为 href="/site/,直接返回正确链接给浏览器,兼容性最好。
操作步骤:
- 启用所需模块:
a2enmod substitute filter systemctl restart apache2
- 在站点虚拟主机的
<Directory /path/to/your/site/root>配置块,或者/site目录下的.htaccess文件中添加如下规则:
AddOutputFilterByType SUBSTITUTE text/html Substitute "s|href=\"/|href=\"/site/|nq"
如果只需要替换特定规则的链接,调整上述正则匹配规则即可。
方案2:mod_rewrite URL重写
如果你不需要修改页面返回内容,仅在请求触发时做跳转/内部重定向,可以选择该方案。
前置操作
先启用 rewrite 模块:
a2enmod rewrite systemctl restart apache2
场景A:所有根路径的/xxx.html请求都指向/site/xxx.html
适合站点根路径下没有和 /site 目录同名的资源、所有 / 开头的资源请求都需要落到 /site 目录的场景,在站点根目录的 .htaccess 或者虚拟主机配置中添加:
RewriteEngine On # 排除已经是/site开头的请求,避免死循环 RewriteCond %{REQUEST_URI} !^/site/ # 末尾加R=302是外部跳转,地址栏会变;去掉R=302是内部重定向,地址栏不变 RewriteRule ^(.*)$ /site/$1 [L,R=302]
场景B:仅从/site页面点击的请求才重定向
如果你希望用户直接访问/something.html仍走根路径,只有从 /site 下的页面点击的链接才跳转到 /site 目录下,可通过 Referer 判断实现:
RewriteEngine On RewriteCond %{HTTP_REFERER} ^https?://www\.example\.com/site/ [NC] RewriteCond %{REQUEST_URI} !^/site/ RewriteRule ^(.*)$ /site/$1 [L,R=302]
注意:该方案依赖浏览器发送 Referer 头,部分用户可能会禁用该头导致规则不生效。
内容的提问来源于stack exchange,提问作者Péter Hatházi
相关产品推荐
相关产品推荐

