0

我的 .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?

4

2 回答 2

1

听起来您正在寻找QSAflag,它代表 Query String Append。它将重写的查询字符串与传入的查询字符串结合起来:

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
于 2013-01-30T05:23:10.170 回答
0

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

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

但是从您的评论中,我得出结论,您希望用户在地址栏中看到“/提交”,但您的脚本可以访问其他 GET 变量。这行不通,看来您误解了重写的概念:

您不是重写index.php?task=submit TO /submit(例如:神奇地向用户展示其他内容),而是重写/submit TO index.php?task=submit(例如:用户请求/submit,此请求在内部被重写为另一个请求)。

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

该脚本的结构如下:

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模式是更好的方法。

于 2013-02-09T17:01:24.457 回答