检索没有参数名称的参数
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]
我有一个注册和激活码,我正在更新一下,在用户注册后,它会向他们发送一封电子邮件来激活。
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]