You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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]

代码细节解释

  1. RewriteBase /rewrite/:指定重写的基准目录,避免路径混乱,因为你的项目部署在 /rewrite/ 下。
  2. 重定向规则:
    • 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 表示停止后续规则处理。
  3. 内部重写规则:
    • ^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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:44