RewriteRule配置导致子目录css、js、图片资源无法加载问题求助
问题原因
你配置的新闻重写规则RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ news.php?newstype=$1&newsid=$2&newstitle=$3 [L,QSA,NC,B]存在路径匹配冲突:
- 该规则会匹配所有路径结构为
/一级目录/二级目录/三级内容的请求,你子目录下的静态资源路径如/css/vender/bootstrap.css刚好符合三级结构,会被这条规则优先拦截,重写到news.php接口,而规则携带的[L]标记会直接终止后续所有重写逻辑,导致资源请求不会走到后续判断真实文件是否存在的步骤。 - 根目录下的
style.css、main.js路径为两级结构,不会命中该规则,所以可以正常加载。
解决方案
在新闻重写规则前添加前置校验条件,跳过静态资源请求或真实存在的文件请求即可,推荐两种实现方式:
方式1:直接排除静态资源目录(性能最优)
在新闻重写规则前添加两行条件,匹配到css、js、images目录的请求直接跳过该重写规则,修改后的完整配置如下:
<IfModule mod_rewrite.c> RewriteEngine On Options +FollowSymlinks # Options +SymLinksIfOwnerMatch RewriteBase / # 新增:排除静态资源目录的重写 RewriteCond %{REQUEST_URI} !^/(css|js|images)/ [NC] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ news.php?newstype=$1&newsid=$2&newstitle=$3 [L,QSA,NC,B] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php # RewriteRule ^(css|js|img)/?$ /$1 [L,QSA,R=301] </IfModule>
方式2:校验请求是否为真实存在的文件/目录(通用性更强)
如果后续新增其他静态资源目录无需重复修改配置,在新闻重写规则前添加文件存在性校验即可:
<IfModule mod_rewrite.c> RewriteEngine On Options +FollowSymlinks # Options +SymLinksIfOwnerMatch RewriteBase / # 新增:请求为真实存在的文件/目录则跳过本条重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ news.php?newstype=$1&newsid=$2&newstitle=$3 [L,QSA,NC,B] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php # RewriteRule ^(css|js|img)/?$ /$1 [L,QSA,R=301] </IfModule>
补充说明
你注释的静态资源跳转规则中匹配的是img目录,但你实际的图片目录名为images,该规则即使开启也不会生效,可直接删除或修改匹配规则为css|js|images。
内容的提问来源于stack exchange,提问作者user3733831
相关产品推荐
相关产品推荐

