使用.htaccess修正从根目录移至子文件夹后的绝对路径问题
解决子目录部署下绝对路径资源的适配问题
没问题,这个场景用Apache的mod_rewrite就能完美解决——不用修改网站代码里的任何资源引用路径,直接通过.htaccess做URL重写就可以适配子目录环境。下面是具体的配置方案和细节说明:
完整的.htaccess配置代码
# 开启URL重写引擎 RewriteEngine On # 仅对开发域名生效,避免误影响生产环境 RewriteCond %{HTTP_HOST} ^development\.com$ [NC] # 跳过实际存在的文件/目录,优先访问真实资源 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 核心重写规则:把根目录的/assets/请求转到/site/assets/ RewriteRule ^assets/(.*)$ /site/assets/$1 [L,R=301]
配置细节解释
- RewriteEngine On:必须先开启这个开关,所有重写规则才能生效,这是基础前提。
- 域名匹配条件:添加
RewriteCond %{HTTP_HOST}...是为了保险——万一这个配置不小心同步到生产服务器,也不会影响production.com的正常运行。[NC]表示忽略大小写,兼容可能的域名大小写输入场景。 - 跳过真实文件/目录:那两个
RewriteCond是为了避免“画蛇添足”——如果根目录下真的存在某个/assets/里的文件/目录,就直接访问它,不执行重写逻辑。 - 核心重写规则:
^assets/(.*)$会匹配所有以/assets/开头的请求,把后面的路径部分(比如path/to/js/script.js)捕获为$1,然后拼接到/site/assets/后面。[L]表示这是最后一条要执行的规则,匹配后就停止后续处理;[R=301]是返回301永久重定向,让浏览器记住新路径(如果不想让地址栏显示变化,只需要内部重写的话,去掉R=301,保留[L]即可)。
额外适配场景
如果你的网站里还有其他根目录开头的资源路径(比如/js/、/css/单独存放),只需要复制核心规则,替换对应的路径前缀即可:
# 适配根目录的/js/路径 RewriteRule ^js/(.*)$ /site/js/$1 [L,R=301] # 适配根目录的/css/路径 RewriteRule ^css/(.*)$ /site/css/$1 [L,R=301]
前置要求
- 确保你的Apache服务器已经启用了
mod_rewrite模块,比如Ubuntu系统可以执行sudo a2enmod rewrite然后重启Apache;CentOS则需要修改httpd.conf里的配置开启该模块。 - 服务器要允许
.htaccess生效,需要在虚拟主机配置里给站点根目录设置AllowOverride All,否则.htaccess的规则不会被执行。
这样配置后,网站里原来的绝对路径资源引用就会自动指向子目录下的对应文件,完美适配开发环境的部署结构。
内容的提问来源于stack exchange,提问作者Tinker
相关产品推荐
相关产品推荐

