求助:.htaccess规则无法实现数据库ID对应URL重定向
解决.htaccess重定向/重写规则不生效的问题
看起来你需要实现两个核心功能:一是让用户访问旧的post.php?id=NUMERO时自动跳转到简洁的/NUMERO(外部重定向),二是让访问/NUMERO时能正常加载对应的内容(内部重写)。你的现有规则只处理了第二部分,而且还有语法细节问题,下面一步步帮你修正:
1. 修正内部重写规则的语法问题
在.htaccess文件中,RewriteRule的模式开头不能加/——因为Apache处理.htaccess时会自动去掉当前目录的前缀(比如网站根目录的请求,前缀就是/),所以你的规则匹配不到任何请求。把规则改成这样:
RewriteRule ^([0-9]+)/?$ post.php?id=$1 [NC,L]
^([0-9]+)/?$:匹配以数字开头、结尾可选带斜杠的URL(比如/7或/7/)[NC,L]:NC表示忽略大小写,L表示这是最后一条规则,匹配后不再继续处理其他规则
2. 添加外部重定向规则(处理旧URL跳转)
你还需要添加一条规则,当用户访问旧的post.php?id=NUMERO时,自动跳转到新的简洁URL,避免重复内容和旧链接失效:
RewriteCond %{THE_REQUEST} ^GET\ /post\.php\?id=([0-9]+) [NC] RewriteRule ^ /%1? [R=301,L]
RewriteCond:匹配原始的请求行,确保是访问post.php?id=数字的GET请求/%1?:%1引用前面捕获的数字,末尾的?是为了去掉原URL的查询参数R=301:表示永久重定向,对SEO友好;如果只是测试阶段,可以先用R=302临时重定向
3. 确保基础配置正确
规则生效还需要满足以下前提:
- 服务器已经启用
mod_rewrite模块(可以通过phpinfo()查看,或者联系主机商确认) - 网站根目录的
.htaccess文件存在,并且Apache的配置中AllowOverride All(或至少AllowOverride FileInfo)已经开启,允许使用重写规则 - 确保没有其他冲突的重写规则覆盖了你的配置
把完整的.htaccess内容整理一下,应该是这样:
RewriteEngine On # 外部重定向:旧URL -> 新URL RewriteCond %{THE_REQUEST} ^GET\ /post\.php\?id=([0-9]+) [NC] RewriteRule ^ /%1? [R=301,L] # 内部重写:新URL -> 实际PHP文件 RewriteRule ^([0-9]+)/?$ post.php?id=$1 [NC,L]
这样配置后,访问https://www.website.com/post.php?id=7会自动跳转到https://www.website.com/7,同时访问https://www.website.com/7也能正常加载对应的内容啦。
内容的提问来源于stack exchange,提问作者andreacappelletti97
相关产品推荐
相关产品推荐

