如果用户手动输入参数,.htaccess / mod_rewrite不起作用

时间:2013-01-30 05:21:05

标签: php .htaccess mod-rewrite

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

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

重定向网站上引用index.php?task = submit to / submit。

的链接

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

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

事实并非如此。您可以将表单指向/submit而不会出现问题,如果它是POST表单的话。如果是GET表格,你需要[QSA]标志,但仍然没有问题。

但是根据您的评论,我得出结论,您希望用户在地址栏中看到“/ 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 模式是更好的方法。