【问题标题】:PHP redirect_to not workingPHP redirect_to 不工作
【发布时间】:2011-11-21 04:15:03
【问题描述】:

我遇到了 PHP redirect_to 的问题。我有一个表单,用户可以在其中选择要上传的图像。成功上传后,我希望将用户重定向到列出数据库中所有图像的页面。以下代码来自名为upload_image.php 的PHP 文件。它与我要重定向到的页面 list_images.php 位于同一目录中。我已将问题范围缩小到以下代码:

if(isset($_POST['submit'])){
$image = new Image();     //User defined class
$image->caption = $_POST['caption'];     //Places caption text field in the database
$image->attach_file($_FILES['file_upload']);     //Copies image to images folder

if($image->save()){
    //Success
    $session->message("Image uploaded successfully!");
    redirect_to('list_images.php');    //PROBLEM AREA. Page never redirects.
}else{
    //Failure
    $message = join("<br />", $image->errors);
}}

redirect_to() 的函数如下:

    function redirect_to($location = NULL){
if($location != NULL){
    header("Location: {$location}");
    exit;
}}

上传的图片总是被成功复制到正确的位置,并且它的信息被存储在数据库中。然而,提交后,我总是在浏览器中留下一个空白页面和 upload_image.php 的 url。通过无数回声测试,我确定问题发生在 redirect_to('list_images.php');我可以在redirect_to 之前将文本回显到空白页上,但是redirect_to 之后的任何内容都不会被执行。

有人有什么建议吗?

谢谢!

【问题讨论】:

  • redirect_to is not a stock PHP function,因此您需要提供其源代码,以便我们有机会帮助您。
  • redirect_to(); 不是原生 PHP 函数。请提供它的定义。
  • redirect_to 不是原生 php 函数,因此请包含您的代码。
  • “我总是留下一个空白页 [...] 通过无数次回声测试”...您知道您可以只使用 set the errorlevel,对吗?
  • 在调用exit() 后,您将无法输出或执行任何操作,如果这是您的意思。无论如何,设置header("Location: ..") 时应该会发生重定向,所以还有另一个问题..

标签: php


【解决方案1】:

重定向的方式是:

header("Location: list_images.php");
exit();

【讨论】:

  • 您缺少与 HTTP 规范匹配的 HTTP 响应正文。
  • @hakre:如果未手动设置,则会发送 302。这还不够吗?
  • 规范要求您也发送一个响应正文来告知新位置,仅一个标头是不够的。这是一个常见的错误,只发送一个位置标头和 3xx 状态码。
  • @chelmetz:感谢添加“退出”。我只显示了实际的重定向行。 @hakre:没有其他要求:如果 location 标头存在且未指定状态,PHP 将自动发送 302; 302 响应不需要响应正文。不确定正式的 RFC,但是我们多年来一直使用这种技术,在任何浏览器中都没有问题。
  • "临时 URI 应该由响应中的 Location 字段给出。除非请求方法是 HEAD,否则响应的实体应该包含一个简短的超文本注释,其中包含指向新的超链接URI(s)。” REF - 如果你有理解问题应该,有一个 RFC 解释如何阅读它:ietf.org/rfc/rfc2119.txt - 这是正式规范,原因是 UA 不能自动重定向。这更像是用户问题(使用浏览器的人)而不是浏览器问题。
【解决方案2】:
header("Location: {$location}");

我认为这不是一个有效的标题。尝试删除“{}”大括号。

【讨论】:

  • {} 大括号只是分隔字符串中的变量名(与${location} 相同)。在"${foo}_bar" 之类的情况下需要这样做,但最好始终使用它来保持清晰
  • 移除牙套没有帮助。仍然没有重定向。不过谢谢你的建议。
  • @redShadow:我不知道如果左大括号在美元符号前面,它也可以工作。谢谢。
  • @Bluewind,是的,这很糟糕,并不总是按预期工作({$aaa[123]} - 或类似的 - 如果我没记错的话,它不起作用)但是是的,这是允许的
【解决方案3】:

您应该让您的功能真正发挥作用(而不是可选的)。此外,如果您实际输出建议的 HTTP 响应正文,您实际上会看到该函数是否被调用(或未被调用):

function redirect_to($location)
{
    if (!headers_sent($file, $line))
    {
        header("Location: " . $location);
    } else {
        printf("<script>location.href='%s';</script>", urlencode($location));
        # or deal with the problem
    }
    printf('<a href="%s">Moved</a>', urlencode($location));
    exit;
}

【讨论】:

    【解决方案4】:

    正确的重定向函数定义如下:

    function redirect_url($path)
    {
      header("location:".$path);
      exit;
    }
    

    欲了解更多信息,请查看:

    https://stackoverflow.com/questions/13539752/redirect-function/13539808

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2012-03-31
      相关资源
      最近更新 更多