如何在htaccess的RewriteRule规则中捕获GET参数
问题解决方法
错误原因
RewriteRule仅匹配URI中?之前的路径部分,不会匹配查询字符串内容,你原有规则将token、status参数写在RewriteRule的匹配规则中,永远无法命中。- 重写规则中
$1、$2是引用RewriteRule路径匹配的捕获分组,查询字符串的捕获分组需要通过RewriteCond匹配,并用%1、%2格式引用。
正确配置
将你原有RewriteRule规则替换为以下内容即可:
RewriteEngine On # 匹配查询字符串中的token和status参数 RewriteCond %{QUERY_STRING} ^token=([^&]+)&status=([^&]+)$ # 匹配路径为/orders/或/orders,将参数处理后重写到orders.php RewriteRule ^orders/?$ /orders.php?lang=it&token=%1&result=%2 [L]
补充说明
- 如果你不需要将
status参数重命名为result,仅需要追加lang=it参数,可使用更简单的配置,依靠QSA(Query String Append)标志自动拼接原有查询参数:
RewriteEngine On RewriteRule ^orders/?$ /orders.php?lang=it [L,QSA]
该配置下你可以直接在orders.php中通过$_GET['token']、$_GET['status']获取原有参数,同时可以拿到追加的$_GET['lang']参数。
- 如果支付回调的查询参数顺序不固定,可使用多条件匹配兼容不同参数顺序:
RewriteEngine On RewriteCond %{QUERY_STRING} (?:^|&)token=([^&]+)(?:&|$) RewriteCond %{QUERY_STRING} (?:^|&)status=([^&]+)(?:&|$) RewriteRule ^orders/?$ /orders.php?lang=it&token=%1&result=%2 [L]
内容的提问来源于stack exchange,提问作者matteo
相关产品推荐
相关产品推荐

