检索没有参数名称的参数

Retrieve parameter that without prarameter name

我有一个注册和激活码,我正在更新一下,在用户注册后,它会向他们发送一封电子邮件来激活。

Link 已通过电子邮件发送

/user/activate/$hashed_confirm_code

生成

http://example.com/user/activate/0dbc0aef3d4d9d3e67ee4bf6c

我去了 http://www.visiospark.com/mod-rewrite-rule-generator/ 并做了 mod 重写,相应地更改了电子邮件 link。

正在重写

RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

RewriteCond %{QUERY_STRING} (^|&)hash_token=($|&)
RewriteRule ^user/activate$ /user/activate/?&%{QUERY_STRING}

如果我点击 link 它会在浏览器中生成以下内容

http://example.com/user/activate/0dbc0aef3d4d9d3e67ee4bf6c

然而它只是给出了一个 500 错误,我的激活码功能的基础是

function activate_user(){

    if (($_SERVER['REQUEST_METHOD'] === "GET") && isset($_SERVER['QUERY_STRING'])) {

        $confirm_code = $_SERVER['QUERY_STRING'];

       //do stuff


    }
}

现在如果我在浏览器中更改 link

example.com/user/activate/0dbc0aef3d4d9d3e67ee4bf6c93c

至此

example.com/user/activate?0dbc0aef3d4d9d3e67ee4bf6c

它有效,所以如果我删除正斜杠并添加问号它有效

重写模式不正确,您应该获取匹配的变量并将其作为查询字符串参数传递给文件(这里我假设它称为activate.php):

RewriteRule ^user/activate/([^/]+)/?$ user/activate.php?code= [L,NC]

PS:我使用了以下标志:

L 导致 mod_rewrite 停止处理规则集。

NC 使 RewriteRule 以不区分大小写的方式匹配。

您还可以使用 QSA 来合并查询字符串。

更新:

RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

这两条规则会产生循环,为什么?因为第一个表示如果您收到包含 .php 的请求,请继续并删除 .php 文件,第二个表示如果我们添加 .php,您是否收到一个有效文件名的请求],继续并向其添加扩展名。您需要考虑的重要事情是,每当您更改 url 时,apache 从顶部开始并尝试与新的 url 匹配。 为防止您可以在文件顶部使用:

#PREVENT SECOND EVALUATION
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L,QSA]