【问题标题】:Retrieve parameter that without prarameter name检索没有参数名称的参数
【发布时间】:2021-05-25 08:50:13
【问题描述】:

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

通过电子邮件发送链接

/user/activate/$hashed_confirm_code

生成

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

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

重写开启

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

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

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

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

【问题讨论】:

    标签: php mod-rewrite


    【解决方案1】:

    重写模式不正确,您应该获取匹配的变量并将其作为查询字符串参数传递给文件(这里我假设它称为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 文件,第二个表示您是否收到如果我们添加.php 将是有效文件名的请求,请继续添加它的扩展。您需要考虑的重要一点是,每当您更改 url 时,apache 从顶部开始并尝试使用新的 url。 为了防止您可以在文件顶部使用:

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

    【讨论】:

    • 我得到了同样的结果
    • @Devflow 如果你删除 "RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R],它会起作用吗?
    • 嘿,我尝试根据您的第一个答案添加第二个链接,它只返回 1 个参数,但在此链接中有 2 个
    • @Devflow 您可以使用我在答案中提到的 QSA 标志
    • 这不是问题RewriteRule ^user/password-reset/([^/]*)([^/]*)?$ user/password-reset.php?reset_token=$1&token=$2 [L,NC] 当我 var dump reset_token 它显示当我 vardump token 它显示 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2012-05-12
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多