如何创建一个表单,其操作URL与当前URL匹配(并保留GET参数)


How do I create a form whose action URL matches the current URL (and preserves GET parameter)?

特别地,我有一个表单,它提交给自己的POST有一些参数,但是我想在提交表单时保留GET参数。

例如,如果原来的URL是http://mydomain.com/download.php?fname=foobar.bin,我希望它成为我制作POST时的URL。但是URL的foobar.bin部分可能会改变。

这是一个最小的工作示例

<?php
$pass = $_POST['pass'];
$filename = $_GET['p'];
$file = "../../cgi-secret/$filename";
if($pass == "foobar")
{
    header('Content-type: application/octet-stream');
    header("Content-Disposition: attachment; filename='"$filename'"");
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    // The PDF source is in original.pdf
    readfile($file);
}
if(isset($_POST))
{?>
    <form method="POST" action="download.php?p=$file">
        Password <input type="password" name="pass"></input>
        <input type="submit" name="submit" value="Get File" ></input>
        </form>
<?}
?>

在这行,我想发布到当前的URL,无论它是

    <form method="POST" action="download.php?p=$filename">

为了给出一些背景,我正试图修改我问题的答案如何用密码保护下载的二进制文件?这样我就可以将文件名作为GET参数传递。

你看到$_SERVER['QUERY_STRING']了吗?当您呈现表单时,除了循环现有的$_GET数组之外,这可能是最直接的方法。

一个例子:

<form method="POST" 
      action="download.php?p=$filename&<?php echo $_SERVER['QUERY_STRING']; ?>">

如果您没有访问$_SERVER['QUERY_STRING']的权限,您可以使用:

    <form method="POST" 
          action="download.php?p=$filename&<?php foreach($_GET as $key => $val) echo $key.'='.urlencode($val).'&'; ?>">