如何在PHP与.htaccess中正确配置URL重写?遇404问题求助
问题分析与解决方案
看起来你把RewriteRule的匹配逻辑搞反啦,而且规则的正则表达式也不符合你想要的路径匹配需求,这就是为什么输入http://localhost/followers会出现404的原因。
你当前写的规则:
RewriteRule ^([a-zA-Z0-9_-]+)/\followers$ followersid.php?id=$1
它匹配的是类似http://localhost/abc/followers这样的嵌套路径(其中abc是符合正则的字符串),然后重写到followersid.php?id=abc——这和你想要的根目录下的/followers完全不匹配,服务器自然找不到对应的资源。
根据你描述的需求(把http://localhost/followersid.php?id=101data重写为http://localhost/followers),这里需要分外部重定向和内部重写两个部分实现,对应的.htaccess代码如下:
RewriteEngine On # 1. 外部重定向:用户访问带参数的动态URL时,自动跳转到简洁的/followers # 用THE_REQUEST匹配原始请求,避免内部重写循环 RewriteCond %{THE_REQUEST} ^GET /followersid\.php\?id=101data [NC] RewriteRule ^ /followers? [R=301,L] # 2. 内部重写:用户访问/followers时,服务器实际处理对应的PHP文件 RewriteRule ^followers$ followersid.php?id=101data [L]
规则解释:
RewriteCond %{THE_REQUEST} ...:精准匹配用户直接访问动态URL的请求,避免内部重写时触发循环重定向。[R=301,L]:R=301是永久重定向,对SEO友好;L表示这是最后一条规则,匹配后不再处理后续规则。- 第二条规则直接匹配根目录下的
followers路径,内部转发到对应的PHP文件,用户在地址栏看不到真实的PHP路径。
如果你实际需求是支持多个id参数(比如/followers/101data对应followersid.php?id=101data),可以用下面的规则:
RewriteEngine On # 外部重定向:动态URL转简洁URL RewriteCond %{THE_REQUEST} ^GET /followersid\.php\?id=([a-zA-Z0-9_-]+) [NC] RewriteRule ^ /followers/%1? [R=301,L] # 内部重写:简洁URL转动态URL RewriteRule ^followers/([a-zA-Z0-9_-]+)$ followersid.php?id=$1 [L]
最后提醒:确保你的.htaccess和followersid.php在同一目录下,且Apache服务器已经开启mod_rewrite模块,同时配置了允许.htaccess覆盖站点配置。
内容的提问来源于stack exchange,提问作者Nancy Moore
相关产品推荐
相关产品推荐

