3

如何在 url 中隐藏参数(query_string),但将它们发送到隐藏的页面,在地址栏中不可见
示例:
我有这个:

http://localhost/index.php?sent=true

我想要:

http://localhost/index.php

但我想在 PHP $_GET['sent'] 中获取发送参数

我试图重定向到没有参数的页面(没有 query_string)[R],然后在没有 [R] 重定向的情况下(无声地)给页面一些参数(不改变地址本身)

我尝试在 htaccess 中使用不同标志和不同方式的 RewriteRule,但没有任何效果

我了解到,如果我想在浏览器中更改地址,我必须在一个 RewriteRule 行中使用 R 标志和 L 标志 - 其他方式不起作用 - 地址不会改变

但是当我使用 [L] 标志时,我无法转到下一行(下一个 RewriteRule)并在没有 [R] 重定向的情况下将任何 query_string 附加到地址

如果我没有在第一行放置 [L] 标志(带有 [R]),我没有新地址,但如果我这样做 - 我不能使用 [C] 标志甚至 [N] 标志


原因如下:

在我的页面上,我在从表单成功发送数据后使用 header('Location: ...?sent=true') 函数我重定向到 ?sent=true 因为我不想用户刷新页面并再次发送相同的数据

但是在重定向到 ?sent=true 之后,我不想在地址栏中使用该 query_string,该页面上还有更多表单将发送其他 POST 数据并用这个丑陋的 query_string 刷新页面

怎么做?

4

3 回答 3

2

你可以设置它,这样如果你访问一个脚本,?sent=true一旦它完成,它会重定向用户

例如

if(!empty($_GET['sent'])&&$_GET['sent']) {
    //do stuff
    header("Location: http://localhost/index.php");
}

您不能使用 htaccess 执行此操作,因为您需要传递给 PHP,它会在重定向后传递给 PHP,因此如果您使用 htaccess 重定向,则该值将永远不会到达 PHP。


进一步的问题,这样做的唯一方法是使用 javascript 表单重定向用户

<?php if(!empty($_GET['sent'])&&$_GET['sent']) { ?>
<form action='http://localhost/index.php' method='post' name='frm'>
    <?php
    foreach ($_GET as $a => $b) {
        echo "<input type='hidden' name='".$a."' value='".$b."'>";
    }
    ?>
    </form>
    <script language="JavaScript">
        document.frm.submit();
    </script>
<?php } ?>
于 2012-10-04T16:12:06.017 回答
1

您可以在 apache 中分配变量:

SetEnvIf Request_URI "\sent=true$" SENT=1

然后在 PHP 中检索它,如:

if (isset($_SERVER['SENT'])) {
   echo "Received sent variable from apache, value is " . $_SERVER['SENT'];
} else {
   echo "not received sent variable from apache";
}

更新
您需要在您的httpd.conf文件或.htaccessAllowOverride FileInfo文件中设置或设置,如下例所示:AllowOverride ALL

<Directory /home>
 AllowOverride FileInfo
</Directory>
于 2012-10-04T16:29:25.840 回答
0

Cookie 可能是一个解决方案,因为您可以使用它们将数据从页面传递到页面并且不可见,至少对于普通用户来说不容易。

或者,如果可能的话,$_SESSION 也是将数据从一页发送到另一页的好解决方案。

于 2012-10-04T16:19:11.500 回答