如何通过.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
相关产品推荐
相关产品推荐

