在php中重定向网址的最佳方法是什么?

时间:2011-06-28 13:23:08

标签: php cakephp curl

我正在开发web应用程序(在php中),我需要使用一些参数重定向url。我已经编写了这样的代码

header("Location:http://www.xyz.com?code=2345");

这将重定向到相应的网址,但我的数据在浏览器中可见,我不希望我的数据在浏览器中可见。我是否隐藏数据?这是重定向的安全方式吗?重定向的最佳方法是什么?

6 个答案:

答案 0 :(得分:1)

使用CakePHP的内置redirect function进行重定向,但该变量仍会在网址中显示。

答案 1 :(得分:0)

你需要使用POST,而不是GET,如果你不想显示它

答案 2 :(得分:0)

如果您重定向到同一主机,则可以将数据存储在会话中并通过cookie传输会话ID。

或者,您可以存储数据并发送会话ID。目标系统读取会话ID并根据会话ID从原始服务器请求原始数据。

答案 3 :(得分:0)

如何在重定向之前在会话中设置变量:

session_start();
$_SESSION['code'] = 2345;
header("Location: http://www.xyz.com");

答案 4 :(得分:0)

为什么不将某些数据设置为session,而不是在URL中使用GET参数?然后,您可以正常重定向,但数据对用户不可见,它存储在服务器端。

答案 5 :(得分:0)

可以将已发送的POST字段重定向到当前请求(通过使用307重定向),但是人工创建它们很棘手,取决于用户是否启用了javascript。我使用此功能,但如果用户禁用了javascript,则不应依赖它。

<?php

function createHiddenFields( $value, $name = NULL )
{
    $output = "";
    if( is_array( $value ) ) {
        foreach( $value as $key => $value ) {
            $output .= self::createHiddenFields( $value, is_null( $name ) ? $key : $name."[$key]" );
        }
    } else {
        $output .= sprintf("<input type=\"hidden\" name=\"%s\" value=\"%s\" />",
            htmlspecialchars( stripslashes( $name ) ),
            htmlspecialchars( stripslashes( $value ) )
        );
    }
    return $output;
}

function redirectNowWithPost( $url, array $post_array = NULL )
{
    if( is_null( $post_array ) ) { //we want to forward our $_POST fields
        header( "Location: $url", TRUE, 307 );
    } elseif( ! $post_array ) { //we don't have any fields to forward
        header( "Location: $url", TRUE );
    } else { //we have some to forward let's fake a custom post w/ javascript
        ?>
<form action="<?php echo htmlspecialchars( $url ); ?>" method="post">
<script type="text/javascript">
//this is a hack so that the submit function doesn't get overridden by a field called "submit"
document.forms[0].___submit___ = document.forms[0].submit;
</script>
<?php print createHiddenFields( $post_array ); ?>
</form>
<script type="text/javascript">
document.forms[0].___submit___();
</script>
        <?php
    }
    exit();
}

?>