.htaccess配置FANCY URL在子文件夹不生效 静态资源加载异常
问题原因排查
- 路径匹配规则不匹配需求:你需要实现的
www.example.com/booking/{varible1}/{varible2}是3级URL路径,原有规则^([^/]*)/([^/]*)$仅能匹配根目录下的2级路径,完全无法命中你要的目标URL格式,导致访问对应路径时规则不生效。 - 静态资源重定向逻辑错误:原有第一条规则会强制把所有多级路径下的img/css/js请求301跳转到根目录对应路径,如果你的静态资源实际存放在项目子目录而非站点根目录,就会触发404错误,导致页面无样式加载。同时301是永久重定向,会被浏览器长期缓存,调试时容易残留旧规则影响。
- 静态资源相对路径引用错误:如果页面内CSS/JS使用相对路径(如
css/main.css),访问三级路径时浏览器会自动拼接为/booking/{varible1}/css/main.css,触发错误的重写规则导致资源加载失败。
修复方案
第一步:替换.htaccess规则为以下内容
RewriteEngine On # 真实存在的文件/目录直接放行,不执行重写 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 适配 /booking/{varible1}/{varible2} 格式的URL RewriteRule ^booking/([^/]+)/([^/]+)$ ./index.php?varible1=$1&varible2=$2 [L,NC]
第二步:修复静态资源引用
两种方案二选一即可:
- 把页面内所有CSS、JS、图片的引用路径改为绝对路径,例如
/css/style.css、/img/logo.png - 在页面
<head>标签的最开头添加base标签,指定页面相对路径的基准地址,示例:<base href="https://www.example.com/">(如果项目部署在子目录,就填子目录的根地址)
调试注意事项
- 替换规则后清空浏览器缓存,避免之前的301重定向缓存影响测试
- 如果项目部署在站点子目录而非根目录,需要在
RewriteEngine On下方新增一行RewriteBase /你的子目录名称/
内容的提问来源于stack exchange,提问作者AnonPHPcoder
相关产品推荐
相关产品推荐

