使用.htaccess重写URL时部分参数触发404错误的技术求助
问题分析与解决方案
首先,你的问题根源出在.htaccess里的RewriteRule正则表达式写错了,导致部分路径无法被正确重写到index.php,从而触发404错误。
为什么会出现差异?
你当前的RewriteRule规则是:
RewriteRule ^([^/index.php]*)$ /index.php?company=$1 [L]
这里的[^/index.php]是否定字符集,它的意思是“匹配任何不是 /、i、n、d、e、x、.、p、h、p 这些单个字符的内容”,而不是“排除整个index.php字符串”。
- 当请求
/aaa时,a不在否定字符集里,所以整个路径匹配正则,规则生效,请求被转发到index.php?company=aaa,因此能正常加载。 - 当请求
/ddd时,d在否定字符集里(因为字符集里包含d),所以整个路径不匹配正则,RewriteRule不触发。服务器会尝试寻找名为ddd的实际文件或目录,找不到就返回404错误。
修复方案
你需要修改.htaccess的Rewrite规则,根据你的需求选择以下两种方案:
方案1:匹配所有非真实文件/目录的请求(推荐)
这个方案会把所有访问不存在的文件或目录的请求,都转发到index.php处理,同时不影响静态资源(比如图片、CSS、JS)的访问:
# 确保请求的不是真实存在的文件 RewriteCond %{REQUEST_FILENAME} !-f # 确保请求的不是真实存在的目录 RewriteCond %{REQUEST_FILENAME} !-d # 把所有路径转发到index.php,company参数为路径内容 RewriteRule ^(.*)$ /index.php?company=$1 [L]
方案2:仅匹配单个路径段(比如/xxx,不匹配/xxx/yyy)
如果你的需求只处理一级路径(不包含子目录),可以用这个规则:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配一个或多个非/的字符(即单个路径段) RewriteRule ^([^/]+)$ /index.php?company=$1 [L]
验证修改
修改完.htaccess后,测试/ddd和/aaa都会被正确转发到index.php,此时你的PHP代码就能正常捕获company参数,不会再出现404错误了。
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

