【问题标题】:is there a good practice Redirect with PHP, that allows to display <BODY> content?是否有使用 PHP 重定向的好习惯,允许显示 <BODY> 内容?
【发布时间】:2014-09-24 20:43:30
【问题描述】:

我在某处读到,不推荐使用 META 刷新进行重定向。

据我所知,PHP 中的header( "refresh:0;url=$url" );, 和&lt;meta http-equiv="refresh" content="0;url=$url/" /&gt;作为 HTML 中的 META 标签, 两者都被视为 META 刷新,它会返回此标头:

HTTP/1.x 200 OK
...
Refresh: 0;url=$url

假设我不想使用 JS 重定向,是否可以使用另一种推荐的做法重定向,例如 301 或 302,同时仍然在重定向页面中运行以下元素,例如以下消息和某个脚本?

<?php
$url = "could-not-get-a-foo-parameter-at-all-error-monitoring-page.html"; 

if(isset($_POST['foo'])){

    switch ($_POST['foo']) {

    case "a":
        $url = "http://www.aaa.com/";
        break;

    case "b":
        $url = "http://www.bbb.com/";
        break;

    default:
        $url = "foo-parameter-exists-but-is-wrong-error-monitoring-page.html";
        break;
    }
}

header( "refresh:0;url=$url" );

?>  
<!doctype html>
<html>
<head>

<style>
.message {
   color:blue;
}
</style>
</head>
<body>
<div class="message">Redirecting, Please hold on...</div>
<script>
something
</script>

【问题讨论】:

  • 不,在发出 HTTP 3xx 重定向时没有理由显示正文内容,因为用户代理(浏览器)将立即请求下一个资源(由 Location: 标头提供)。跨度>
  • 嘿@rockyraw!很高兴看到您再次发布几乎相同的问题。
  • @JayBlanchard 我不敢苟同,这是一个相似的代码,但不是完全相同的问题
  • 我说“几乎”。 ¯_(ツ)_/¯

标签: php


【解决方案1】:

简短的回答。没有。

PHP 标头重定向,&lt;?php header('location: [url]');?&gt; 将为您提供 302 标头,浏览器将重定向到该标头,但您也不能发送用户将看到的 HTML,因为一旦浏览器看到该标头,它将立即重定向并且不会显示其余内容。 您可以按照 TML 的建议更改元重定向的超时时间,但这将使页面保持打开状态,直到时间间隔过去,或者您可以使用您的消息创建一个插页式页面,并让他们知道重定向发生前的时间,现在可以选择单击“此处”进行立即重定向。

【讨论】:

  • 我相信 OP 希望页面能正常运行一段时间。
  • @Shomz 我不希望重定向页面启动一段时间,只需要大约一秒钟,足以显示“重定向你”消息并执行跟踪 JS 脚本
  • 什么是插页式页面?这不正是我已经在这里做的吗?
  • @rockyraw 是的,我理解,“上升一段时间”是指“不立即重定向”。不想暗示很长一段时间,抱歉。
【解决方案2】:

一旦页面呈现,您就不能调用 PHP(在另一个服务器请求之前不能再调用 PHP),因此任何形式的延迟重定向都是不可能的。您被 JS 或元标题刷新卡住了(显然,您不能在纯 HTML 中使用 PHP 变量,如果您真的想在重定向之前让页面保持一段时间,则需要超过 0 秒)。

【讨论】:

  • 你的答案显然是错误的。
  • @TML 告诉我更多信息,您可以在 PHP 完成呈现您正在查看的页面后调用它吗?
  • 您不需要“在完成呈现您正在查看的页面后调用 PHP”来获得所需的效果。看我的回答。
  • 问题中的所有内容都可以使用“0”以外的刷新值来完成。正文内容将一直显示,直到超时。
  • @TML OP 显然知道这一点。让我为您拼写:“是否可以使用另一个推荐的做法...”另一个。得到它?对此我回复:“你被 JS 或元标题刷新卡住了......”。
【解决方案3】:

使用所有 3 个选项,因为它会优雅地降级。

  1. 元刷新。 (在禁用 JS 的情况下工作)
  2. JS 位置重定向。 (允许比元刷新更多的控制,快速)
  3. 静态 HTML 锚。 (对于那些希望内容比刷新更快的人的备份)

不确定这是否仍然是一个问题,但某些浏览器不会发送 0 秒元刷新的引用标头,而是需要一点时间来设置它。

【讨论】:

  • 1) 事情是我不愿意(出于我自己的原因)在页面的源代码中的任何地方都有 URL,这意味着我唯一的选择可能是只在标题中发送 URL . 2)您的意思是为了安全措施,我应该始终使用至少一个1 秒作为间隔? 3. 你所说的更多控制和敏捷是什么意思?
  • 1) 没有 URL,浏览器不知道去哪里。无论采用何种方法,URL 都将始终暴露给客户端。 2)嗯,这是一个老错误,1秒是修复,不确定当前状态,但可以安全地放一些时间在那里。 3) JS 让您有机会在客户端使用 URL 并在您决定进行重定向时立即响应,为您提供比元刷新更多的功能,但元刷新在 JS 被禁用时有效。
  • 1) 浏览器会知道是否通过发送的标头获取信息,而不是从页面源获取信息。不是吗?我的意思是这正是我当前的代码所做的。 2) 所以你说 0 秒 JS 重定向会比 0 秒元刷新更快?这对我的访客有多大意义?出于好奇,由于只能进行一次重定向,您建议将哪一项作为后备(JS/META)以及应设置的时间间隔?
  • hmm 不确定元刷新 vrs JS 和谁赢了......页面的块加载可能会看到元刷新等到至少标题完全加载,JS 会触发一旦它的块被加载,很可能都取决于它们的位置以及最终首先完全加载到 DOM 中......我只是结合使用所有方法。
【解决方案4】:

使用非 0 的刷新值: header( "refresh:10;url=$url" );

【讨论】:

  • 告诉 OP 为什么刷新值必须不同。
  • 因为这不是问题真正主题的答案(这是关于推荐的替代重定向方法),我想这是评论?你能解释为什么不是 0 吗?
  • 如果你想要“显示正文并运行一些 javascript”,那么给出一个非零的时间就可以做到这一点。 “0”是 UA 在跟随刷新 URL 之前等待的秒数。
  • @TML 我正在寻找一种替代的重定向方法来做同样的事情。当前 0 间隔确实显示消息并执行脚本。
猜你喜欢
  • 2015-09-05
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2014-07-18
相关资源
最近更新 更多