.htaccess 不会转义 RewriteRule 上的问号

Posted

技术标签:

【中文标题】.htaccess 不会转义 RewriteRule 上的问号【英文标题】:.htaccess doesn't escape question mark on RewriteRule 【发布时间】:2018-10-24 18:00:13 【问题描述】:

我有一个使用旧类型单点登录的网站。父网站使用如下 URL 将用户发送到我的网站:

http://blabla.test/index.php?gid=abcd1234&u=bcanata&id=11472

我想改写成这样:

http://blabla.test/login/abcd1234/bcanata/11472

我创建了一个 .htaccess 文件,如下所示:

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^index.php?gid=(.*)&u=(.*)&id=(.*)$ login/$1/$2/$3 [L]

我尝试将 URL 中的问号转义为:

RewriteRule ^index.php\?gid=(.*)&u=(.*)&id=(.*)$ login/$1/$2/$3 [L]

但是,不幸的是,这两个规则都不匹配并重写 URL,我不明白为什么。

【问题讨论】:

真的应该开始阅读您使用的工具的文档... 查询字符串 不是 请求 URL 的一部分,您需要使用 RewriteCond 测试和捕获它,您不能在 RewriteRule 中执行此操作。看一下官方文档。作为开源项目的典型代表,它具有出色的质量并带有很好的示例:httpd.apache.org/docs/current/mod/mod_rewrite.html 【参考方案1】:

您无法匹配 RewriteRule 指令模式中的 url QueryString。您只能匹配 RewriteRule 中的 url 路径(即:index.php)。 ? 符号后的 URL 部分是 URL QueryString。您需要匹配 RewriteCond 中的 %QUERY_STRING 变量。

RewriteEngine on

RewriteCond %QUERY_STRING ^gid=([^&]+)&u=([^&]+)&id=([^&]+)$ [NC]
RewriteRule ^index.php$  /login/%1/%2/%3? [L,R]

【讨论】:

以上是关于.htaccess 不会转义 RewriteRule 上的问号的主要内容,如果未能解决你的问题,请参考以下文章

使用GeoIP和.htaccess重定向流量

http到https重定向使用htaccess在角度6中不起作用

在 $_GET 中使用转义 & 符号的 htaccess 重写规则失败

需要在 .htaccess 重写规则中转义 # (hash/pound) 字符

Http Auth 不适用于 PHP

Rewrite的Rewrite介绍