本地localhost环境下URL重写功能无法正常工作求助
解决URL重写:将带参数的product.php转换为友好路径
看起来你搞反了规则的匹配方向,还缺少了关键的重定向步骤,我来一步步帮你理清问题:
首先,你的需求其实包含两个核心场景:
- 当用户访问旧的
http://localhost/rewrite/product.php?id=1时,地址栏要跳转到友好的http://localhost/rewrite/product.php/1(外部重定向,让用户看到友好URL) - 当用户访问友好URL时,服务器内部要悄悄映射到实际的
product.php?id=1处理请求(内部重写,地址栏保持不变)
你现有规则的问题
你用在线工具生成的 RewriteRule /id/(.*) product.php?id=$1 是匹配包含 /id/ 的URL,和你想要的 product.php/1 形式完全不匹配,自然不会生效。
正确的.htaccess配置
把下面的代码放到 /rewrite/ 目录下的 .htaccess 文件中:
Options +FollowSymLinks RewriteEngine On RewriteBase /rewrite/ # 1. 重定向旧的带参数URL到友好URL(更新地址栏) RewriteCond %{THE_REQUEST} ^GET\ /rewrite/product\.php\?id=(\d+)\ HTTP RewriteRule ^product\.php$ product.php/%1? [R=301,L] # 2. 内部重写友好URL到实际处理脚本(地址栏不变) RewriteRule ^product\.php/(\d+)$ product.php?id=$1 [L]
代码细节解释
- RewriteBase /rewrite/:指定重写的基准目录,避免路径混乱,因为你的项目部署在
/rewrite/下。 - 重定向规则:
RewriteCond %{THE_REQUEST}匹配原始的HTTP请求行,确保我们只处理用户直接访问的旧URL,避免内部重写时触发循环。^GET\ /rewrite/product\.php\?id=(\d+)\ HTTP捕获id值(这里假设id是数字,如果你需要支持其他字符,可以把\d+改成[^/]+)。RewriteRule ^product\.php$ product.php/%1?把旧URL重定向到友好路径,末尾的?是为了清除原有的查询字符串,R=301表示永久重定向(利于SEO),L表示停止后续规则处理。
- 内部重写规则:
^product\.php/(\d+)$匹配友好的product.php/1形式的URL,捕获后面的id值。product.php?id=$1内部映射到实际的带参数脚本,L确保不会继续处理其他规则。
额外注意事项
- 确认你的
.htaccess确实放在/rewrite/目录下,而不是服务器根目录。 - 虽然你根目录的
AllowOverride All已开启,但最好确认/rewrite/对应的<Directory>块也设置了AllowOverride All,避免权限限制导致规则不生效。
内容的提问来源于stack exchange,提问作者Mad Coder
相关产品推荐
相关产品推荐

