【问题标题】:.htaccess/mod_rewrite not working if user manually enters parameters如果用户手动输入参数,.htaccess/mod_rewrite 不起作用
【发布时间】:2013-02-10 01:01:24
【问题描述】:

我的 .htaccess 文件中有一条规则:

RewriteRule ^submit index.php?task=submit [L]

将站点上引用 index.php?task=submit 的链接重定向到 /submit。

但是,我将信息发布到同一页面,因此最终 URL 看起来像这样:

index.php?task=submit&path=xyz&key=xyz.jpg&code=1234

由于发布方法的性质,我必须发布到 index.php?task=submit。

如果用户手动输入扩展路径作为url,是否有规则会重写url?

【问题讨论】:

    标签: php .htaccess mod-rewrite


    【解决方案1】:

    听起来您正在寻找QSA flag,它代表查询字符串附加。它会将重写的查询字符串与传入的查询字符串结合起来:

    RewriteRule ^submit index.php?task=submit [L,QSA]
    

    这意味着这...

    /submit?path=xyz&key=xyz.jpg&code=1234
    

    ...将被正确地重写为:

    index.php?task=submit&path=xyz&key=xyz.jpg&code=1234
    

    【讨论】:

    • 感谢您提供的信息,但它并不完全正确。我想要这个: index.php?task=submit&path=xyz&key=xyz.jpg&code=1234 被重写到 /submit ,同时仍然能够访问 $_GET 参数,即使用户手动被定向到完整路径或手动使用参数输入完整路径。
    • 在这种情况下,您最好通过Location: 标头在您的代码中手动执行重定向,而不是尝试在 mod_rewrite 中执行此操作,后者通常用于另一个方向。
    【解决方案2】:

    由于发布方法的性质,我必须发布到 index.php?task=submit。

    这不是真的。您可以将一个表单指向/submit,如果它是一个POST 表单的话。如果是 GET 表单,则需要 [QSA] 标志,但仍然没有问题。

    但是根据您的 cmets,我得出的结论是,您希望用户在地址栏中看到“/submit”,但您的脚本可以访问其他 GET 变量。这不能工作,看来你误解了重写的概念:

    你不是重写index.php?task=submit TO /submit(比如:神奇地向用户展示别的东西),而是重写/submit TO index.php?task=submit(比如:用户请求/submit,这个请求在内部被重写为另一个请求)。

    因此,如果原始请求不包含任何方式的路径、密钥、代码信息,那么重写的请求也不能。但是您可以将它们存储在会话中,然后使用 PHP 重定向到 /submit

    脚本的结构如下:

    session_start();
    if (isset($_GET['path'])) {
        $_SESSION['path'] = $_GET['path'];
        header('Location: http://' . $_SERVER['HTTP_HOST'] . '/submit');
        session_write_close();
        exit;
    }
    if (isset($_SESSION['path'])) {
        $path = $_SESSION['path'];
        unset($_SESSION['path']);
        // do stuff with $path
    }
    

    这是否是一个合理的解决方案取决于此“提交”操作的作用。对于诸如检索信息的搜索可能没问题,但对于存储信息的任何事物,POST/REDIRECT/GET 模式是更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多