2011-03-13 55 views
1

我正在开发一个自定义内容管理脚本,并且正在进行页面重定向。设置变量并使用标题()

下面的代码将URL代码与数据库中某个页面ID的URL进行比较,如果两个URL不相同,则用户将被重定向。

但是,我想添加一个变量,以便我们可以检查页面是否已被重定向。它不工作。

if (isset ($_GET ['id']) && $rawdata) { 
     if ($_SERVER ["REQUEST_URI"] != $rawdata ['htmltitle']) { 
      header ("HTTP/1.1 301 Moved Permanently"); 
      header ("Location: http://${_SERVER['SERVER_NAME']}:${_SERVER["SERVER_PORT"]}${rawdata['htmltitle']}"); 
      $redirected = true; 
      ; 
     } 
    } 

if ($redirected == true) { 
      print_redirect_nonexpected(); 
     } 

function print_redirect_nonexpected(){ 
echo "<!-- REDIRECTED _ NOT _ EXPECTED ? -->"; 
} 

函数没有运行,所以没有回显。 任何想法我在这里做错了吗?

回答

1

使用此:

header ("Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['SERVER_PORT'].$rawdata['htmltitle']); 

如果$ RAWDATA [ 'htmltitle']是你的页面的完整URL,这样使用:

header ("Location: http://".$rawdata['htmltitle']); 

,并且还加入die()header()后是良好的。

+0

不,不起作用。它也被称为htmltitle。 – bear 2011-03-13 23:26:51

+0

哦,是什么错误。看看我的更新。 – Kemal 2011-03-13 23:38:06

-1

一旦发送位置标题,浏览器将中止当前操作并在重定向位置获取页面。这意味着对于所有的意图和目的,一个位置('header:example.com')与die()具有基本相同的效果。您可以使用输出缓冲来覆盖此行为,也可以将头()调用移到脚本中。但是,您不能将它们移动到print_redirect_unexpected调用之后,因为向浏览器发送任何输出都会导致所有标题都被发送,并且您将无法再发送。

所以基本上,你需要打开输出缓冲。

+0

-1:'header('Location:')'不杀死活动脚本。但它确实阻止您看到脚本的输出。试图阻止未经授权的用户制作不需要的“DELETE”时,这是一个重要的细微差别。 – 2011-03-13 22:57:59

+0

我确实说过“基本上”。虽然这是真的脚本继续运行,你永远不会看到它的输出,所以效果几乎是一样die(),除非你的脚本导致文件系统/数据库的变化。 – GordonM 2011-03-13 23:01:01

+0

这是一个非常重要的除非。 – 2011-03-13 23:32:57

1

当您发送Location:标头时,用户代理将停止加载当前页面并加载您告诉它加载的任何页面,以便您永远不会看到输出。

但是,你的代码可能*继续在后台执行,所以平时要跟随你header()exit;,以防止不必要的行为。

*取决于服务器配置和ignore_user_abort

另外,header("Location: /{$rawdata['htmltitle']}");就足够了。由于您重定向到同一台服务器,因此绝对路径就足够了。不要使用$_SERVER变量过度复制您的重定向。

+0

那么我会如何处理这种情况呢? – bear 2011-03-13 23:27:18

+0

@Shamil:在重定向URL中使用GET变量传递状态信息或使用'$ _SESSION'变量。 – 2011-03-13 23:34:40

+0

我试着添加一个GET,但是,重定向失败。 – bear 2011-03-13 23:35:40