.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 上的问号的主要内容,如果未能解决你的问题,请参考以下文章
http到https重定向使用htaccess在角度6中不起作用
在 $_GET 中使用转义 & 符号的 htaccess 重写规则失败