PHP站点URL伪静态配置:获取无?url=的请求路径内容
解决PHP MVC站点的URL重写问题
嘿,我来帮你搞定这个URL美化的问题!你现在遇到的情况是典型的MVC模式下需要把带查询字符串的URL转成干净路径的需求,咱们直接看怎么改配置就行。
你的.htaccess已经写了开头的重写条件,但关键的RewriteRule没写完,这就是为什么直接访问/hello会报404的原因——Apache不知道要把这个请求转发到你的入口文件(一般是index.php)。
修改后的完整.htaccess配置
<IfModule mod_rewrite.c> Options -Multiviews RewriteEngine On RewriteBase /phpmvc.loc/public # 排除真实存在的目录 RewriteCond %{REQUEST_FILENAME} !-d # 排除真实存在的文件 RewriteCond %{REQUEST_FILENAME} !-f # 将所有请求转发到index.php,并把路径作为url参数传递 RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] </IfModule>
关键规则解释
RewriteRule ^(.+)$ index.php?url=$1:把请求的路径(比如hello)捕获下来,作为url参数传递给index.php,这样你就能在PHP里通过$_GET['url']拿到hello了。[QSA]:全称是Query String Append,意思是如果原URL带其他参数(比如/hello?id=123),会把这些参数也附加到新请求里,不会丢失。[L]:全称是Last,告诉Apache这是最后一条重写规则,处理完就停止,避免后续规则干扰。
额外注意事项
- 确保Apache的
mod_rewrite模块已经开启:可以通过phpinfo()查看模块状态,或者在Apache配置文件(比如httpd.conf)里去掉#LoadModule rewrite_module modules/mod_rewrite.so前面的注释。 - 站点目录的
AllowOverride要设为All:在你的虚拟主机配置(比如httpd-vhosts.conf)里,对应phpmvc.loc的目录块要加上:<Directory "/path/to/your/phpmvc.loc/public"> AllowOverride All Require all granted </Directory> - PHP入口文件的处理:在
index.php里可以这样获取参数:// 若没有传递url参数,默认设为home $url = $_GET['url'] ?? 'home'; // 接下来就可以根据$url的值处理路由逻辑了
这样修改后,访问http://phpmvc.loc/hello就会自动转发到http://phpmvc.loc/index.php?url=hello,你就能正常获取到hello这个内容啦!
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

