【问题标题】:hide parameter (query string) in url (htaccess) but send this parameter to a page (php)在 url (htaccess) 中隐藏参数(查询字符串),但将此参数发送到页面 (php)
【发布时间】:2012-09-25 17:33:56
【问题描述】:

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

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

我想要:

http://localhost/index.php

但我想在 PHP $_GET['sent'] 中获取 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 刷新页面

怎么做?

【问题讨论】:

    标签: php .htaccess mod-rewrite redirect hide


    【解决方案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 文件或 .htaccess 文件中设置 AllowOverride FileInfoAllowOverride ALL,例如:

    <Directory /home>
     AllowOverride FileInfo
    </Directory>
    

    【讨论】:

    • 但是如果我打开了许多选项卡并且我同时发送数据怎么办? cookie 和会话也存在同样的问题。 apache 变量、cookie 或会话对于浏览器中的所有页面/选项卡都是全局的,并且用户操作始终特定于具体选项卡
    • 你错了,这个apache变量是在每个请求中设置的,不会跨会话等以任何方式缓存,每个页面请求都是唯一的。
    • 我将此行添加到 htaccess 并且输出是“未收到从 apache 发送的变量”
    • 您的 .htaccess 或 httpd.conf 文件中应该有 AllowOverride FileInfo。
    • 我无法访问 httpd.conf(不是我的服务器),但是当我添加 AllowOverride FileInfo 甚至 AllowOverride 时,什么都没有发生 - 只有服务器错误 :)
    【解决方案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 } ?>
    

    【讨论】:

    • 是的,但我想在成功后向用户显示消息,所以我从 url 获取 $_GET['sent'] 参数,如果有,我会显示消息
    • 这是个好主意!谢谢!我什至可以用 php 在页面上“绘制”表单,动作参数也指向 index.php。但我很好奇是否可以发送参数而不在 url 中显示它们? :)
    【解决方案3】:

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

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

    【讨论】:

    • 但是如果我打开了多个页面(标签)怎么办?我同时提交表格?我将覆盖一个带有“已发送”变量的 cookie
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2011-08-26
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多