使用.htaccess搭建URL路由时文件存在则不跳转至控制器页面的问题
嘿,这个问题我熟!你遇到的是Apache的默认行为在搞鬼——当请求的路径能对应到服务器上真实存在的文件或目录时,Apache会直接去加载那个资源,完全跳过你的Rewrite规则,根本不给PHP处理的机会。另外很可能你的服务器开启了MultiViews选项,它会自动把类似/users/edit-profile/这样的路径映射到users/edit-profile.php,这也会让你的重写规则失效。
别担心,调整一下你的.htaccess就能解决问题,具体步骤如下:
第一步:关闭MultiViews选项
在.htaccess的最开头加上这一行,阻止Apache自动匹配文件:
Options -MultiViews
第二步:修改Rewrite规则,强制所有请求走index.php
我们需要添加一个条件,确保重写规则不会循环处理index.php本身,同时让规则不管文件/目录是否存在都能执行。修改后的完整代码如下:
Options -MultiViews RewriteEngine On # 避免循环重写index.php RewriteCond %{REQUEST_URI} !^/index\.php$ # 原有的三级路径规则 RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?vfirst=$1&vsecond=$2&vthird=$3 [NC,L] # 二级路径规则 RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?vfirst=$1&vsecond=$2 [NC,L] # 一级路径规则 RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?vfirst=$1 [NC,L]
为什么这样有效?
Options -MultiViews关闭了内容协商功能,Apache不会再自动把路径映射到对应的PHP文件;RewriteCond %{REQUEST_URI} !^/index\.php$确保我们不会陷入无限循环(不会把index.php的请求再重写回自己);- 去掉了默认的文件/目录存在检查,所以不管请求的路径对应的文件是否存在,都会触发重写规则,把请求转发到
index.php,这样你PHP里的文件存在判断逻辑就能正常工作了。
试一下,现在不管你有没有创建对应的PHP文件,请求都会先到index.php,由你的代码来决定下一步该怎么做!
内容的提问来源于stack exchange,提问作者skingman
相关产品推荐
相关产品推荐

