如何用.htaccess重写URL并保留原有GET参数?
实现URL重写的解决方案
没问题,这其实是个很常见的URL重写需求,用Apache的mod_rewrite模块就能轻松搞定。
首先要确保两个前提:你的Apache服务器已经启用了mod_rewrite模块,并且网站根目录的服务器配置允许使用.htaccess文件(一般需要在主配置里设置AllowOverride All)。
接下来,在网站根目录创建或编辑.htaccess文件,添加以下规则:
RewriteEngine On # 将 /watch?v=xxx 重写为 /index.php?v=xxx RewriteCond %{QUERY_STRING} ^v=([0-9]+)$ RewriteRule ^watch$ index.php [L,QSA]
规则解释:
RewriteEngine On:开启URL重写引擎,这是所有重写规则的基础,必须放在最前面。RewriteCond %{QUERY_STRING} ^v=([0-9]+)$:这条条件用来匹配请求的查询字符串,确保是v=数字的格式。如果你的参数值可能包含字母、下划线等其他字符,可以把[0-9]+改成[^&]+,这样就能匹配任意非&的字符了。RewriteRule ^watch$ index.php [L,QSA]:^watch$:精确匹配请求的URL路径为/watch,不会匹配/watch/abc这类带后缀的路径。index.php:指定重写后的目标文件路径。[L,QSA]:L标记表示这是最后一条规则,匹配成功后就不再处理后续规则;QSA(Query String Append)是关键,它会自动把原有的查询字符串(也就是v=123456789)附加到目标URL后面,不用我们手动拼接。
额外说明:
如果用户访问的URL可能带斜杠(比如/watch/?v=123456789),可以把RewriteRule改成下面这样,这样不管有没有斜杠都能匹配到:
RewriteRule ^watch/?$ index.php [L,QSA]
测试的时候直接访问http://example.com/watch?v=123456789,服务器会在内部转发到index.php?v=123456789,而浏览器地址栏不会显示变化(这是内部重写,完全符合你的需求)。
内容的提问来源于stack exchange,提问作者Sukhchain Singh
相关产品推荐
相关产品推荐

