PHP网站多规则URL重写冲突问题及目标URL结构配置求助
PHP网站多规则URL重写冲突问题及目标URL结构配置求助
嗨,我来帮你搞定这个URL重写的问题!你想要的这种层级清晰的URL结构不仅用户友好,对SEO也很有帮助,咱们来调整你的.htaccess规则,完美实现你想要的效果。
首先先明确你的需求:
- 根域名
https://sample.com/→ 显示首页 - 一级分类页
https://sample.com/services/https://sample.com/blog→ 对应各自的分类页面 - 二级详情页
https://sample.com/services/service-a/https://sample.com/blog/blog-a→ 对应分类下的具体内容
你当前的规则存在两个问题:一是规则顺序不对(会导致二级路径被错误匹配成一级),二是第二条规则的参数没写完,另外还缺少必要的文件/目录排除规则,容易和实际存在的文件(比如css、js)冲突。
给你整理好的完整.htaccess配置:
# 开启URL重写引擎 RewriteEngine On # 排除实际存在的文件和目录,避免重写干扰静态资源或真实目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 先处理二级路径(比如services/service-a),这条要放在前面! RewriteRule ^([0-9a-zA-Z-_]+)/([0-9a-zA-Z-_]+)$ index.php?page=$1&slug=$2 [L] # 再处理一级路径(比如services、blog) RewriteRule ^([0-9a-zA-Z-_]+)$ index.php?page=$1 [L]
关键说明:
- 规则顺序很重要:必须先匹配二级路径,再匹配一级路径。如果反过来,
services/service-a会被第一条规则截取成page=services,剩下的/service-a就无法正确传递了。 - [L]标记:表示匹配到这条规则后就停止后续处理,避免重复匹配。
- 排除文件/目录:
RewriteCond这两行是为了让服务器忽略真实存在的文件(比如style.css)和目录,只重写不存在的虚拟路径。
在PHP里怎么获取参数:
- 当访问
https://sample.com/services时,$_GET['page']的值是services,没有slug参数,你可以在代码里判断显示分类列表页。 - 当访问
https://sample.com/services/service-a时,$_GET['page']是services,$_GET['slug']是service-a,你可以根据这两个参数加载对应的详情内容。 - 访问根域名时,
$_GET['page']不存在,直接显示首页即可。
注意事项:
- 确保你的服务器已经开启了
mod_rewrite模块(Apache服务器默认一般是开启的,若没开需要联系主机商或修改配置)。 .htaccess文件一定要放在网站的根目录下。- 如果你的URL里需要包含其他特殊字符,可以调整正则表达式
[0-9a-zA-Z-_],比如允许点号的话改成[0-9a-zA-Z-_.]。
备注:内容来源于stack exchange,提问作者Linda
相关产品推荐
相关产品推荐

