求助:Apache将子目录形式URL内部重写为查询字符串的规则
实现Apache URL重写:将
host.com/links/<a>/<b>/<c>转换为host.com/links/?a=1&b=2&c=3 没问题!我来帮你搞定这个Apache URL重写的需求,其实规则并不复杂,我会一步步给你讲清楚怎么写,以及每个部分的作用。
首先,得确保Apache的mod_rewrite模块已经开启——这是重写功能的基础:
- 如果是自己管理的Linux服务器,直接执行命令
sudo a2enmod rewrite开启模块,然后重启Apache服务(比如sudo systemctl restart apache2) - 如果是虚拟主机,一般主机商会默认开启这个模块,不确定的话可以联系客服确认
接下来,在你的links目录下创建(或编辑已有的).htaccess文件,把下面的规则复制进去:
# 开启重写引擎 RewriteEngine On # 避免重写真实存在的文件/目录(比如静态资源) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 核心重写规则:匹配/links/<a>/<b>/<c>格式并转成带参数的URL RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /links/?a=$1&b=$2&c=$3 [L,QSA]
我来拆解一下规则里的关键部分,让你明白为什么这么写:
RewriteEngine On:必须先开启重写引擎,否则所有规则都不会生效- 那两行
RewriteCond:是给重写加了个前置条件——只有当请求的路径不是真实文件(!-f)、也不是真实目录(!-d)时,才执行后面的重写。这样可以避免规则破坏links目录下的真实文件(比如图片、CSS、JS)的访问 RewriteRule的正则部分^([^/]+)/([^/]+)/([^/]+)$:^和$分别匹配URL的开头和结尾,确保我们只匹配完整的三级路径([^/]+)是正则的捕获组,意思是“捕获一组不包含斜杠的字符”,这里有三个捕获组,分别对应<a>、<b>、<c>的值,后面用$1、$2、$3来引用这些捕获到的内容
- 目标路径
/links/?a=$1&b=$2&c=$3:就是把捕获到的三个值分别赋值给a、b、c三个查询参数 - 最后的
[L,QSA]是规则的标志:L:表示这是最后一条规则,匹配到之后就停止处理后续规则,避免冲突QSA:全称是Query String Append,如果原始URL带了额外的参数(比如host.com/links/1/2/3?foo=bar),这个标志会把额外参数追加到重写后的URL后面,变成host.com/links/?a=1&b=2&c=3&foo=bar,非常实用
最后测试一下:当你访问host.com/links/1/2/3时,Apache会在内部悄悄把请求转成host.com/links/?a=1&b=2&c=3,浏览器地址栏不会有变化(这是内部重写,完全符合你的需求)。
内容的提问来源于stack exchange,提问作者Ofek Ron
相关产品推荐
相关产品推荐

