PHP站点如何将含多斜杠的拼写错误URL强制跳转至index.php
问题根源
- 当前配置同时混用了
ErrorDocument、FallbackResource和多组重写规则,逻辑冲突导致重定向循环 - Apache默认开启
AcceptPathInfo,会把index.php/xxx/yyy这类路径中/xxx/yyy部分当成路径参数传给index.php,不会触发404,所以出现地址不变、CSS因相对路径加载失败的问题 - 重写规则顺序不合理,后缀去斜杠、异常路径跳转的规则优先级不足
修复后的完整.htaccess代码
# 关闭PathInfo,避免index.php后接路径被当成参数传入 AcceptPathInfo Off ErrorDocument 404 /mkv4/index.php ErrorDocument 500 /mkv4/index.php RewriteEngine On # 指定子目录重写基础路径,适配站点部署在/mkv4子目录的场景 RewriteBase /mkv4/ # 1. 优先处理尾部斜杠跳转,避免目录识别异常 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ $1 [R=301,L] # 2. 保留原有projekt伪静态规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^projekt/([0-9a-zA-Z_-]+) projekt.php?projekt_url=$1 [NC,L] # 3. 排除真实存在的文件/目录/软链接,不做跳转 RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] # 4. 所有不存在的路径统一301跳转到index.php,同步更新地址栏 RewriteRule ^.*$ index.php [R=301,L]
修复说明
- 场景2无限重定向:删除了冲突的
FallbackResource和跳转404.php的重复规则,指定RewriteBase避免子目录跳转路径错误 - 场景3地址不变无样式:关闭
AcceptPathInfo后index.php/xxx这类路径会被判定为不存在,直接触发301跳转到index.php,地址栏更新后CSS相对路径也会正常加载 - 原有正常跳转的场景1不受影响
测试前请清空浏览器缓存,301重定向会被浏览器永久缓存,避免旧缓存干扰测试。如果需要进一步避免CSS路径异常,可以把CSS引用路径改为站点根路径绝对路径,比如/mkv4/css/style.css。
内容的提问来源于stack exchange,提问作者vexqus
相关产品推荐
相关产品推荐

