如何配置.htaccess实现rest_api路由的通用URL重写?
解决.htaccess URL重写适配rest_api所有方法的问题
首先得指出你之前写的规则为什么没生效——问题出在两个关键地方:
- 你的正则没有捕获
feed/后面的核心内容(比如rest_api/count_products),所以$1是空值,导致重写后的route参数只到extension/feed/,直接丢失了后续的方法路径; - 规则完全没处理
&key=123456这类额外参数,直接把这部分内容截断了。
根据你的需求(适配rest_api下所有方法,自动给route参数添加extension/前缀),我分两种常见场景给出解决方案:
场景1:访问的URL是无?的路径式参数(即你给出的示例格式)
也就是用户访问 http://teste.com.br/route=feed/rest_api/count_products&key=123456 这种把参数直接写在路径里的格式,用下面的规则就能完美适配:
RewriteEngine On # 通用匹配所有feed/开头的路径请求,自动给route添加extension/前缀 RewriteRule ^route=feed/(.*)$ index.php?route=extension/feed/$1 [QSA,L]
规则细节解释:
^route=feed/(.*)$:精准匹配路径以route=feed/开头的所有请求,(.*)会捕获后面的所有内容(包括rest_api/xxx这类方法路径,以及&key=yyy这类额外参数);index.php?route=extension/feed/$1:把捕获到的内容拼接到extension/feed/后面,生成符合要求的目标查询参数;QSA:确保原请求的额外参数(比如key)会自动追加到新的查询字符串里,不会丢失;L:表示这是最后一条规则,匹配成功后不再执行后续规则,避免冲突。
场景2:访问的URL是标准带?的查询字符串格式
如果你的实际请求是更标准的格式,比如 http://teste.com.br/?route=feed/rest_api/count_products&key=123456,就需要用RewriteCond来匹配查询字符串:
RewriteEngine On # 避免循环重写:如果已经是访问index.php,直接跳过后续规则 RewriteRule ^index\.php$ - [L] # 匹配查询字符串里以route=feed/开头的请求 RewriteCond %{QUERY_STRING} ^route=feed/(.*)$ # 重写根路径请求到index.php,同时替换route参数 RewriteRule ^$ index.php?route=extension/feed/%1 [QSA,L]
额外注意事项:
- 确保你的Apache服务器已经启用了
mod_rewrite模块; - 网站根目录的
.htaccess文件要能生效,需要在Apache配置里把对应目录的AllowOverride设置为All; - 测试时可以直接访问目标URL检查返回内容,也可以开启Apache的RewriteLog来调试规则匹配情况。
内容的提问来源于stack exchange,提问作者Alessandro Gomes
相关产品推荐
相关产品推荐

