window.location (JS)和header() (PHP)用于重定向,它们有什么区别?

25

使用JS:(在<head>标签中)

<script>window.location="https://stackoverflow.com";</script>

使用 PHP:(在 <head> 标签中)

header('Location: https://stackoverflow.com');
end();

我应该使用哪一个?还是其他的?

另外,使用<meta>标签如何?

<meta http-equiv="refresh" content="0;url=https://stackoverflow.com"/> 

有很多好的答案,我不知道要接受哪个答案,非常感谢。


2
JavaScript 在文档加载时重定向,PHP 在解析 PHP 代码时开始重定向,.htaccess(在 Apache 服务器上)在请求进入时立即重定向。越早重定向越好,并记得发送正确的代码(301 或 302 等)。 - adeneo
<meta>标签怎么样?@adeneo - l2aelba
1
避免像瘟疫一样使用meta refresh标签。 - adeneo
刷新页面时,meta标记使用什么? @adeneo - l2aelba
1
除非你运行的是新闻网站或类似每五分钟自动刷新一次的网站,否则请避免使用meta refresh。 - adeneo
6个回答

27

所有选项的结果都是相同的,重定向。

HTML中的<meta>

  • 显示您网站的内容,并在几秒钟(或0秒)后重定向用户。
  • 不需要启用JavaScript。
  • 不需要PHP。

JS中的window.location

  • 需要启用JavaScript。
  • 不需要PHP。
  • 显示您网站的内容,并在几秒钟(或0秒)后重定向用户。
  • 重定向可以依赖于任何条件 if (1 === 1) { window.location.href = 'http://example.com'; }

PHP中的header('Location:')

  • 不需要启用JavaScript。
  • 需要PHP。
  • 重定向将首先执行,用户永远看不到之后的内容。header()必须是php脚本中的第一个命令,在输出任何其他内容之前。如果尝试在header之前输出一些内容,则会收到一个警告:无法修改头信息 - 头部已发送

14

通过以下方式在JS中设置位置更好:

window.location.href = 'https://stackoverflow.com';

使用PHP或JS来管理重定向取决于你的代码在做什么以及如何做。但是如果你有机会使用PHP,也就是说,如果你要使用PHP将一些JS代码发送回浏览器,只需告诉浏览器去其他地方,那么逻辑上建议你应该通过PHP直接告诉浏览器,而不是中间人。


8
取决于您想要在何时以及如何将用户重定向到另一个页面。
如果您希望立即将用户重定向到另一个页面而不需要他在两个页面之间看到任何内容,则应使用PHP header 重定向方法。
如果您有JavaScript并且用户的某些操作会导致他进入另一个页面,那么此时应使用window.locationmeta标签刷新通常在下载站点上使用,每当您看到这些“您的下载应该自动开始”的消息时。 您可以让用户加载页面,等待一定时间,然后将其重定向(例如到要下载的文件),无需使用JavaScript。

3

如果可能的话,使用PHP重定向会更好,因为使用JavaScript重定向会导致客户端在重定向之前加载页面,而使用PHP则会发送正确的标头。

但是,PHP不应该放在<head>中,在向客户端发送任何输出之前使用它,否则会引起错误。

使用<meta>标签与JavaScript存在相同的问题,会在执行重定向之前加载初始页面。如果可以使用服务器端重定向,则几乎总是更好的选择。


但是我将JS放在<head>中,然后在此之后使用end();(PHP)。 - l2aelba
2
在向浏览器发送任何输出之前,尽可能多地完成你的 PHP 工作。如果在发送输出后再尝试执行涉及头部(如重定向)的操作,则会导致“无法修改头信息”错误。 - krisnoble

2
第一种情况在JS关闭时会失败。而且它会慢一些,因为必须先解析JS(DOM 必须被加载)。但是,使用JS更安全,因为目标网页不知道来源,你的重定向可能会被跟踪(引荐者通常不可靠,但这是个例外)。
您还可以使用meta refresh 标签。它也需要 DOM 被加载。

0
window.location.href = 'url';

更好。
header('location:url');

由于头部命令通常会返回错误“警告:无法修改头信息 - 头已发送”

使用js window.location.href = 'url';

这是更好的选择


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接