首页 > 解决方案 > .htaccess 不会转义 RewriteRule 上的问号

问题描述

我有一个旧类型的单点登录网站。父网站使用如下 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,我不明白为什么。

标签: apache.htaccessnginxmod-rewrite

解决方案


您不能在 RewriteRule 指令的模式中匹配 url QueryString。您只能匹配index.phpRewriteRule 中的 url 路径(即:)。?符号后的 URL 部分是 URL QueryString。您将需要匹配%{QUERY_STRING}.RewriteCond

RewriteEngine on

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

推荐阅读