问题描述
我有一个注册和激活码,我正在更新它,在用户注册后它会向他们发送一封电子邮件以进行激活。
/user/activate/$hashed_confirm_code
产生
http://example.com/user/activate/0dbc0aef3d4d9d3e67ee4bf6c
我去了 http://www.visiospark.com/mod-rewrite-rule-generator/ 并进行了模组重写,相应地更改了电子邮件链接。
重写已开启
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}
http://example.com/user/activate/0dbc0aef3d4d9d3e67ee4bf6c
function activate_user(){
if (($_SERVER['REQUEST_METHOD'] === "GET") && isset($_SERVER['QUERY_STRING'])) {
$confirm_code = $_SERVER['QUERY_STRING'];
//do stuff
}
}
现在如果我在浏览器中更改链接
example.com/user/activate/0dbc0aef3d4d9d3e67ee4bf6c93c
到这里
example.com/user/activate?0dbc0aef3d4d9d3e67ee4bf6c
解决方法
重写模式不正确,您应该获取匹配的变量并将其作为查询字符串参数传递给文件(这里我假设它称为activate.php
):
RewriteRule ^user/activate/([^/]+)/?$ user/activate.php?code=$1 [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
文件,第二个表示如果我们添加 {{1} },继续添加扩展名。您需要考虑的重要一点是,每当您更改 url 时,apache 都会从顶部开始并尝试使用新的 url。
为了防止您可以在文件顶部使用:
.php