在url(htaccess)中隐藏参数(查询字符串),但将此参数发送到页面(php)

时间:2012-10-04 16:10:52

标签: php .htaccess mod-rewrite redirect hide

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

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

我想:

http://localhost/index.php

但我希望在PHP $ _GET中发送参数['发送']

我试图重定向到没有参数的页面(没有query_string)[R],之后给页面一些参数(静默)没有[R]重定向(不改变地址本身)

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

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

但是当我使用[L]标志时我不能转到下一行(下一个RewriteRule)并将任何query_string附加到地址而没有[R]重定向

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


原因如下:

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

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

怎么做?

3 个答案:

答案 0 :(得分:2)

您可以设置它,以便在完成后使用?sent=true访问脚本时,会重定向用户

e.g。

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 } ?>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以在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 文件或 .htaccess 文件中设置AllowOverride FileInfoAllowOverride ALL,如下例所示:

<Directory /home>
 AllowOverride FileInfo
</Directory>