如何通过.htaccess动态重写src标签以适配多子项目目录的资源路径
动态适配所有子项目的Apache重写规则解决方案
没问题,我帮你把这个重写规则改成动态适配所有project*子项目的版本,完全符合你先检查根目录资源、再匹配对应项目目录的逻辑!
核心思路
我们需要实现两个关键逻辑:
- 当用户访问某个
project*子项目的页面时,记录当前访问的项目(用Cookie实现,可靠且无侵入) - 处理资源请求时,优先检查根目录是否存在该资源;如果不存在,再根据记录的项目重写到对应子项目目录
修改后的完整.htaccess规则
# -------------------------- # 第一步:记录当前访问的子项目(设置Cookie) # -------------------------- # 当访问subfolder下的任意project*目录时,设置Cookie保存项目名称 RewriteCond %{REQUEST_URI} ^/root/subfolder/(project\d+)/ [NC] # 格式说明:CO=Cookie名称:值:域名:有效期(天):路径:是否仅HTTPS:是否HttpOnly # 本地测试用localhost,正式环境替换成你的域名(比如example.com) RewriteRule ^ - [CO=current_project:%1:localhost:1:/:false:true] # -------------------------- # 第二步:处理资源请求的重写逻辑 # -------------------------- # 1. 优先检查根目录是否存在该资源,如果存在,直接返回(不重写) RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -f RewriteRule ^(.*\.(gif|jpg|png|svg|js|css))$ - [L] # 2. 如果根目录不存在,检查Cookie中记录的项目目录是否存在该资源 RewriteCond %{HTTP_COOKIE} current_project=([^;]+) [NC] RewriteCond %{DOCUMENT_ROOT}/root/subfolder/%1/%{REQUEST_URI} -f # 重写到对应项目的目录下 RewriteRule ^(.*\.(gif|jpg|png|svg|js|css))$ root/subfolder/%1/$1 [L] # 3. 可选:如果根目录和对应项目目录都不存在资源,返回404 RewriteRule ^(.*\.(gif|jpg|png|svg|js|css))$ - [R=404,L]
规则说明
- Cookie记录部分:当用户访问
/root/subfolder/project1/或/root/subfolder/project2/这类路径时,会自动设置一个名为current_project的Cookie,值为对应的项目名称(比如project1),有效期1天,确保后续资源请求能匹配到正确的项目。 - 资源检查逻辑:
- 首先判断请求的资源是否在根目录存在(比如请求
/script.js,会检查root/script.js),存在就直接返回,满足你的例外需求。 - 如果根目录没有该资源,就读取Cookie中的项目名称,检查对应项目目录下是否存在(比如
root/subfolder/project1/script.js),存在则重写请求到该路径。
- 首先判断请求的资源是否在根目录存在(比如请求
- 兼容原有逻辑:如果请求本身就是某个项目目录下的资源(比如
/root/subfolder/project1/script.js),第一步的根目录检查会发现该路径存在,直接返回,和你原来的!project1/.*条件效果一致。
适配你的文件夹结构
以project1为例:
- 当用户访问
root/subfolder/project1/index时,Cookie会被设置为current_project=project1 - 如果页面中请求
/script.js,先检查root/script.js是否存在:- 存在:直接返回根目录的
script.js - 不存在:重写到
root/subfolder/project1/script.js返回
- 存在:直接返回根目录的
内容的提问来源于stack exchange,提问作者jhon dano
相关产品推荐
相关产品推荐

