Apache重写规则问题:访问指定伪URL时无法调用index.php如何解决?
Apache URL重写问题排查与修复
你的现有规则存在三个关键问题,导致无法实现预期效果:
主机头匹配不完整
原规则的RewriteCond %{HTTP_HOST} ^(example.com)$仅匹配不带www的域名,但你测试的URL是https://www.example.com/twyyt/6543,带www的请求根本不会触发这条规则。未校验路径是否存在
你需要的是仅当/twyyt/开头的路径不存在时才重写,但原规则没有做任何存在性检查——不管这个路径对应的文件或目录是否真实存在,都会强制跳转到index.php,完全不符合需求逻辑。缺少规则终止标志
规则末尾没有添加[L]标志,可能导致后续其他重写规则覆盖或干扰当前规则的执行结果。
修正后的规则
# 匹配带www或不带www的example.com域名 RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ # 检查请求的路径不是存在的文件或目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配/twyyt/开头的任意路径,重写到index.php并终止后续规则 RewriteRule ^twyyt/(.*)$ /index.php [L]
关键规则解释
^(www\.)?example\.com$:正则表达式中的(www\.)?表示可选的www前缀,同时兼容带www和不带www的域名请求。!-f和!-d:这两个条件组合起来,确保只有当请求的路径既不是存在的文件(!-f),也不是存在的目录(!-d)时,才会执行后续的重写。[L]:这个标志告诉Apache,当前规则执行完毕后就停止处理后续的重写规则,避免不必要的冲突。
内容的提问来源于stack exchange,提问作者Eli Summers
相关产品推荐
相关产品推荐

