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

如何通过.htaccess重写表单提交后的GET请求URL?

没问题,这是个非常常见的URL美化需求,用Apache的mod_rewrite就能轻松搞定。我会一步步给你讲清楚规则写法和背后的逻辑,确保你能直接套用。

第一步:确认前提条件

首先得保证你的Apache服务器已经启用了mod_rewrite模块。如果是自己管理服务器,可以通过修改httpd.conf或者执行启用命令来开启;如果是虚拟主机,大部分服务商默认已经开启,不确定的话可以咨询主机提供商。

第二步:编写.htaccess规则

在网站根目录下创建(或编辑已有的).htaccess文件,添加以下规则:

首先开启Rewrite引擎:

RewriteEngine On

接下来是核心的两条规则,分别处理内部重写和外部重定向:

1. 内部重写:把友好URL映射到实际脚本

这条规则会让服务器在收到example.com/country/Argentina这类请求时,内部悄悄转发到results.php?country=Argentina,用户浏览器的地址栏不会发生变化:

# 匹配/country/xxx格式的URL,内部转发到results.php
RewriteRule ^country/([^/]+)$ results.php?country=$1 [L,QSA]

拆解一下规则细节:

  • ^country/([^/]+)$:正则表达式,匹配以country/开头、后面跟着任意非斜杠字符(也就是国家名称)的URL。([^/]+)是捕获组,用来提取用户输入的国家名称。
  • results.php?country=$1:目标路径,$1对应前面捕获组提取的内容,也就是国家名称。
  • [L,QSA]:标志位,L表示这是最后一条规则,匹配到就停止处理后续规则;QSA表示如果原URL带有其他查询参数(比如/country/Argentina?foo=bar),会自动附加到目标URL后,变成results.php?country=Argentina&foo=bar,保留额外参数。

2. 外部重定向:把旧URL跳转到友好URL

这条规则是为了让访问旧格式example.com/results.php?country=Argentina的用户自动跳转到新的友好URL,同时告诉搜索引擎更新索引(对SEO友好):

# 访问旧的带参数URL时,301永久重定向到友好URL
RewriteCond %{QUERY_STRING} ^country=([^&]+)$
RewriteRule ^results\.php$ /country/%1? [R=301,L]

细节解释:

  • RewriteCond %{QUERY_STRING} ^country=([^&]+)$:条件判断,检查查询字符串是否是country=xxx的格式,([^&]+)捕获国家名称。
  • RewriteRule ^results\.php$ /country/%1?:匹配访问results.php的请求,重定向到/country/%1,%1对应前面条件里捕获的国家名称。末尾的?是为了去掉原有的查询字符串,避免重定向后URL变成/country/Argentina?country=Argentina。
  • [R=301,L]:R=301表示永久重定向,搜索引擎会更新索引;L同样是停止后续规则的处理。
可选:更简洁的URL格式

如果你觉得/country/前缀有点冗余,想直接用example.com/Argentina这样的短格式,可以修改规则,但要注意避免和实际文件/目录冲突:

内部重写规则(带冲突规避):

# 仅当请求的不是实际文件或目录时,才重写URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ results.php?country=$1 [L,QSA]

对应的重定向规则:

RewriteCond %{QUERY_STRING} ^country=([^&]+)$
RewriteRule ^results\.php$ /%1? [R=301,L]
额外注意事项
  • 大小写问题:如果你的国家名称匹配不区分大小写,可以在规则里加NC标志(No Case),比如RewriteRule ^country/([^/]+)$ results.php?country=$1 [L,QSA,NC]。
  • 特殊字符处理:如果国家名称包含空格或特殊字符(比如Côte d'Ivoire),浏览器会自动编码成URL安全格式(比如C%C3%B4te+d'Ivoire),mod_rewrite会自动解码传递给results.php,你直接用$_GET['country']就能拿到正确名称。
  • 测试验证:修改完.htaccess后,一定要测试两种场景:访问友好URL是否能显示正确结果,访问旧URL是否会自动跳转到新URL。如果出现500错误,大概率是规则语法有误,检查正则表达式或者确认mod_rewrite是否开启。

内容的提问来源于stack exchange,提问作者kvolden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:26:02