PHP Conference Japan 2024

header

(PHP 4, PHP 5, PHP 7, PHP 8)

header发送原始 HTTP 头

描述

header(字符串 $header, 布尔值 $replace = true, 整数 $response_code = 0):

header() 用于发送原始 HTTP 头。有关 HTTP 头的更多信息,请参阅 » HTTP/1.1 规范

请记住,header() 必须在发送任何实际输出之前调用,无论是通过普通的 HTML 标签、文件中的空行还是来自 PHP。一个非常常见的错误是在代码中使用 includerequire 函数或其他文件访问函数,并且在调用 header() 之前输出空格或空行。在使用单个 PHP/HTML 文件时也存在相同的问题。

<html>
<?php
/* 这将导致错误。请注意上面的输出
* 在 header() 调用之前 */
header('Location: http://www.example.com/');
exit;
?>

参数

header

头字符串。

有两个特殊情况的 header 调用。第一个是 header 以字符串 "HTTP/" 开头(不区分大小写),它将用于确定要发送的 HTTP 状态代码。例如,如果您已将 Apache 配置为使用 PHP 脚本处理缺少文件的请求(使用 ErrorDocument 指令),您可能希望确保您的脚本生成正确的状态代码。

<?php
// 此示例说明了“HTTP/”特殊情况
// 在典型用例中更好的替代方案包括:
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
// (覆盖仍在使用 HTTP/1.0 的客户端的 http 状态消息)
// 2. http_response_code(404); (使用默认消息)
header("HTTP/1.1 404 Not Found");
?>

第二个特殊情况是“Location:” header。它不仅将此 header 发送回浏览器,而且还向浏览器返回 REDIRECT (302) 状态代码,除非已设置 2013xx 状态代码。

<?php
header
("Location: http://www.example.com/"); /* 重定向浏览器 */

/* 确保在重定向时不会执行下面的代码。 */
exit;
?>

replace

可选的 replace 参数指示 header 是否应替换先前类似的 header,或添加第二个相同类型的 header。默认情况下,它将替换,但如果您将 false 作为第二个参数传递,则可以强制使用多个相同类型的 header。例如

<?php
header
('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>

response_code

强制 HTTP 响应代码为指定值。请注意,此参数仅在 header 不为空时才有效。

返回值

不返回值。

错误/异常

如果无法安排发送 header,header() 将发出 E_WARNING 级别错误。

示例

示例 #1 下载对话框

如果您希望提示用户保存您正在发送的数据(例如生成的 PDF 文件),您可以使用 » Content-Disposition header 提供建议的文件名并强制浏览器显示保存对话框。

<?php
// 我们将输出一个 PDF
header('Content-Type: application/pdf');

// 它将被称为 downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// PDF 源文件在 original.pdf 中
readfile('original.pdf');
?>

示例 #2 缓存指令

PHP 脚本通常会生成动态内容,客户端浏览器或服务器和客户端浏览器之间的任何代理缓存都不应缓存这些内容。许多代理和客户端可以通过以下方式强制禁用缓存:

<?php
header
("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 过去的时间
?>

注意:

您可能会发现即使您没有输出上面所有 header,您的页面也没有被缓存。用户可以为其浏览器设置许多选项,这些选项会更改其默认缓存行为。通过发送上面的 header,您应该覆盖可能导致脚本输出被缓存的任何设置。

此外,session_cache_limiter()session.cache_limiter 配置设置可用于在使用会话时自动生成正确的与缓存相关的 header。

示例 #3 设置 Cookie

setcookie() 提供了一种方便的方式来设置 Cookie。要设置一个包含 setcookie() 不支持的属性的 Cookie,可以使用 header()

例如,以下设置一个包含 Partitioned 属性的 Cookie。

<?php
header
('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');
?>

注释

注意:

只有在使用支持 header 的 SAPI 时,header 才能被访问和输出。

注意:

您可以使用输出缓冲来解决此问题,所有输出到浏览器的开销都将在服务器中缓冲,直到您将其发送出去。您可以通过在脚本中调用 ob_start()ob_end_flush() 或在 php.ini 或服务器配置文件中将 output_buffering 配置指令设置为 on 来实现此目的。

注意:

HTTP 状态 header 行将始终最先发送到客户端,而不管实际的 header() 调用是否为第一个。除非 HTTP header 已发送,否则可以通过在任何时间使用新的状态行调用 header() 来覆盖状态。

注意:

大多数现代客户端都接受相对 URI 作为 » Location: 的参数,但一些较旧的客户端需要包含方案、主机名和绝对路径的绝对 URI。您通常可以使用 $_SERVER['HTTP_HOST']$_SERVER['PHP_SELF']dirname() 函数从相对 URI 自己构建绝对 URI。

<?php
/* 重定向到当前目录中请求的不同页面 */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

注意:

即使启用了 session.use_trans_sid,会话 ID 也不会随 Location 头一起传递。必须使用 SID 常量手动传递。

参见

添加注释

用户贡献的注释 26 条注释

mjt at jpeto dot net
15 年前
我强烈建议您使用

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

而不是

header("HTTP/1.1 404 Not Found");

我在 Apache/2.0.59 (Unix) 回答 HTTP/1.0 时遇到了很大的麻烦,而我(意外地)添加了一个“HTTP/1.1 200 Ok”头信息。

大多数页面显示正确,但在某些页面上,Apache 向其中添加了奇怪的内容

页面顶部(在任何 PHP 脚本输出之前)的 4 位十六进制代码,似乎是一种校验和,因为它会因页面和浏览器而异。(相同页面和浏览器下代码相同)

页面底部(在 PHP 脚本完全输出之后)的“0”

我花了好长时间才发现 HTTP 头信息中的协议错误。
Marcel G
14 年前
这个问题在网上被问过很多次,但在 php.net 的文档中找不到答案……

如果您想重定向用户并告诉他将被重定向,例如“您将在大约 5 秒后被重定向。如果未重定向,请点击此处”,则不能使用 header( 'Location: ...' ),因为在发送头信息之前您无法发送任何输出。

因此,您必须使用 HTML 元刷新或使用以下方法

<?php
header
( "refresh:5;url=wherever.php" );
echo
'You\'ll be redirected in about 5 secs. If not, click <a href="wherever.php">here</a>.';
?>

希望对某人有帮助
Dylan at WeDefy dot com
17 年前
一种快速实现永久或临时重定向的方法是利用 header() 中的 $http_response_code 参数。

<?php
// 301 Moved Permanently
header("Location: /foo.php",TRUE,301);

// 302 Found
header("Location: /foo.php",TRUE,302);
header("Location: /foo.php");

// 303 See Other
header("Location: /foo.php",TRUE,303);

// 307 Temporary Redirect
header("Location: /foo.php",TRUE,307);
?>

HTTP 状态代码会改变浏览器和机器人处理重定向的方式,因此,如果您使用 header(Location:),最好同时设置状态代码。浏览器通常每次都会重新请求 307 页面,为会话缓存 302 页面,并为 301 页面缓存更长时间,甚至无限期缓存。搜索引擎通常将“页面排名”转移到 301 重定向的新位置,但不会转移到 302、303 或 307。如果未指定状态代码,则 header('Location:') 默认设置为 302。
mandor at mandor dot net
18 年前
当使用 PHP 输出图像时,客户端不会缓存它,因此,如果您不希望每次重新加载页面时都下载图像,则需要模拟 HTTP 协议的一部分。

方法如下

<?php

// 测试图像。
$fn = '/test/foo.png';

// 获取客户端发送的头信息。
$headers = apache_request_headers();

// 检查客户端是否正在验证其缓存以及缓存是否是最新的。
if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
// 客户端的缓存是最新的,因此我们只响应“304 未修改”。
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
} else {
// 图像未缓存或缓存已过期,我们响应“200 OK”并输出图像。
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
header('Content-Length: '.filesize($fn));
header('Content-Type: image/png');
print
file_get_contents($fn);
}

?>

这样,foo.png 将被客户端正确缓存,从而节省带宽。:)
Emmanuel Chazard
1 年前
如果您使用 header() 允许用户下载文件,则检查脚本本身的编码非常重要。您的脚本应使用 UTF-8 编码,但绝对不能使用 UTF-8-BOM!BOM 的存在会更改用户接收到的文件。请看以下脚本

<?php

$content
= file_get_contents('test_download.png') ;
$name = 'test.png' ;
$size = strlen($content) ;

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: 0');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-Length: ' . $size);
header('Pragma: public');

echo
$content ;

?>

无论 test_download.png 的编码如何,当此 PHP 脚本以 UTF-8-BOM 编码时,用户接收到的内容都不同。
- 文件开头添加了一个 ZWNBSP 字节 (U+FEFF)。
- 文件内容被截断!
如果这是一个二进制文件(例如图像、专有格式),则文件将变得无法读取。
php at ober-mail dot de
4 年前
从 PHP 5.4 开始,可以使用 `http_​response_​code()` 函数设置响应代码,而不是使用 `header()` 函数,后者还需要设置正确的协议版本(这可能会导致问题,如其他评论中所见)。
bebertjean at yahoo dot fr
16 年前
如果使用 'header' 函数下载文件,特别是如果将文件名作为变量传递,请记住用双引号括起文件名,否则一旦文件名中包含空格,Firefox 就会出现问题。

所以,不要输入

<?php
header
("Content-Disposition: attachment; filename=" . basename($filename));
?>

你应该输入

<?php
header
("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");
?>

如果不这样做,当用户点击名为“Example file with spaces.txt”的文件链接时,Firefox 的“另存为”对话框将为其命名为“Example”,并且没有扩展名。

请参阅以下网址中名为“Filenames_with_spaces_are_truncated_upon_download”的页面:
http://kb.mozillazine.org/ 获取更多信息。(抱歉,该网站不允许我发布这么长的链接……)
David Spector
3 年前
请注意,PHP、浏览器或 Web 开发人员工具中都没有对 header 命令进行错误检查。

如果使用类似“header('text/javascript');”来设置 PHP 响应文本的 MIME 类型(例如回显或包含的数据),则会发生未诊断的故障。

正确的 MIME 设置函数是“header('Content-type: text/javascript');”。
yjf_victor
8 年前
根据 RFC 6226 (https://tools.ietf.org/html/rfc6266),发送带有编码的 Content-Disposition 标头的唯一方法是

Content-Disposition: attachment;
filename*= UTF-8''%e2%82%ac%20rates

为了向后兼容,应该发送的是

Content-Disposition: attachment;
filename="EURO rates";
filename*=utf-8''%e2%82%ac%20rates

因此,我们应该使用

<?php
$filename
= '中文文件名.exe'; // 中文文件名

$contentDispositionField = 'Content-Disposition: attachment; '
. sprintf('filename="%s"; ', rawurlencode($filename))
.
sprintf("filename*=utf-8''%s", rawurlencode($filename));

header('Content-Type: application/octet-stream');

header($contentDispositionField);

readfile('file_to_download.exe');
?>

我在 IE6-10、Firefox 和 Chrome 中测试了此代码。
sk89q
16 年前
您可以使用 HTTP 的 etags 和上次修改日期来确保您没有向浏览器发送其已缓存的数据。

<?php
$last_modified_time
= filemtime($file);
$etag = md5_file($file);

header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");

if (@
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
?>
nospam at nospam dot com
8 年前
<?php

// 使用 header('Location: /target.php', true, $code) 将用户转发到另一个页面时的响应代码行为:
header('Location: /target.php', true, $code) to forward user to another page:

$code = 301;
// 当旧页面已被“永久移动,并且任何未来的请求都应发送到目标页面时使用。可能转移 PageRank。”

$code = 302; (默认)
// “临时重定向,因此仅在 Cache-Control 或 Expires 标头字段指示时才缓存页面。”

$code = 303;
// “此方法主要用于允许 POST 激活脚本的输出将用户代理重定向到选定的资源。新的 URI 并非原始请求资源的替代引用,也不会被缓存。”

$code = 307;
// 注意,在使用 POST 提交表单后使用时,它会将已发布的值传递到下一页,例如,如果 target.php 包含表单处理脚本,它将再次处理提交的信息!

// 换句话说,如果永久使用 301,如果临时使用 302,如果提交表单的结果页面使用 303。
// 如果表单处理脚本已移动,则可能使用 307。

?>
tim at sharpwebdevelopment dot com
6 年前
header 调用可能会误导 PHP 新手。
当提到“header 调用”时,指的是文件的左上角位置,而不是“header()”函数本身。
“<?php” 开启标签必须放在任何其他内容之前,甚至包括空格。
David
7 年前
似乎指出 URI 必须是绝对的说明已过时。在 https://en.wikipedia.org/wiki/HTTP_location 上找到

“HTTP 1.1 规范的旧版本 (IETF RFC 2616) 要求重定向使用完整的绝对 URI。[2] IETF HTTP 工作组发现大多数流行的 Web 浏览器都容忍传递相对 URL[3],因此,更新的 HTTP 1.1 规范 (IETF RFC 7231) 放宽了原始约束,允许在 Location 标头中使用相对 URL。”
ben at indietorrent dot org
12 年前
请注意,如果包含以下任何标头,则通过加密连接 (SSL/TLS) 向用户代理 (浏览器) 发送二进制文件将在 IE(Internet Explorer)5、6、7 和 8 版本中失败

Cache-control:no-store
Cache-control:no-cache

请参阅:http://support.microsoft.com/kb/323308

解决方法:不要发送这些标头。

此外,请注意,IE 5、6、7 和 8 版本会对已压缩的文件进行双重压缩,并且不会正确地反转此过程,因此 ZIP 文件等在下载时会损坏。

解决方法:为这些特定版本的 IE 禁用压缩(超出 text/html),例如,使用 Apache 的“BrowserMatch”指令。以下示例在所有版本的 IE 中禁用压缩

BrowserMatch ".*MSIE.*" gzip-only-text/html
chris at ocproducts dot com
7 年前
请注意,'session_start' 可能会覆盖您的自定义缓存标头。
要解决此问题,您需要调用

session_cache_limiter('');



...在您设置自定义缓存头之后。它会告诉 PHP 会话代码不要自行进行任何缓存头更改。
jp at webgraphe dot com
21 年前
在语句之前调用 session_write_close()

<?php
header
("Location: URL");
exit();
?>

如果您希望确保在继续重定向之前更新会话,则建议这样做。

我们遇到了一种情况,重定向访问的脚本没有正确加载会话,因为前面的脚本没有时间更新它(我们使用了数据库处理器)。

JP。
shutout2730 at yahoo dot com
16 年前
需要注意的是,当第一个字节输出到浏览器时,实际上会发送头信息。如果您在脚本中替换头信息,则意味着 echo/print 语句和输出缓冲区的位置可能会实际影响发送哪些头信息。在重定向的情况下,如果您忘记在发送头信息后终止脚本,添加缓冲区或发送字符可能会更改用户被发送到的页面。

这会重定向到 2.html,因为第二个头信息替换了第一个头信息。

<?php
header
("location: 1.html");
header("location: 2.html"); //replaces 1.html
?>

这会重定向到 1.html,因为头信息在 echo 发生后立即发送。您也不会看到任何“头信息已发送”错误,因为浏览器在显示错误之前就会遵循重定向。

<?php
header
("location: 1.html");
echo
"send data";
header("location: 2.html"); //1.html already sent
?>

将前面的示例包装在输出缓冲区中实际上会更改脚本的行为!这是因为头信息直到输出缓冲区被刷新才会发送。

<?php
ob_start
();
header("location: 1.html");
echo
"send data";
header("location: 2.html"); //replaces 1.html
ob_end_flush(); //now the headers are sent
?>
Refugnic
14 年前
我的文件处于压缩状态 (bz2)。当用户点击链接时,我希望他们获得文件的未压缩版本。

解压缩文件后,我遇到了一个问题,即即使我告诉对话框“始终对此文件类型执行此操作”,下载对话框也会始终弹出。

我发现,问题出在 header 指令“Content-Disposition”中,即“attachment”指令。

如果您希望浏览器模拟到文件的普通链接,请将“attachment”更改为“inline”或完全省略它,这样就可以了。

我花了一段时间才弄清楚这一点,我希望它能帮助其他遇到同样问题的人。
dev at omikrosys dot com
15 年前
只是通知大家,不要混淆 Content-Transfer-Encoding 和 Content-Encoding

Content-Transfer-Encoding 指定用于在 HTTP 协议内传输数据的编码,例如原始二进制或 base64。(二进制比 base64 更紧凑。base64 有 33% 的开销)。
例如使用:- header('Content-Transfer-Encoding: binary');

Content-Encoding 用于将 gzip 压缩等应用于内容/数据。
例如使用:- header('Content-Encoding: gzip');
razvan_bc at yahoo dot com
6 年前
<?php
/* This will give an error. Note the output
* above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

这个例子非常好,但是当你使用“exit”时,解析器仍然会继续工作以确定接下来会发生什么,“exit”的操作应该这样做(因为如果你查看手册,exit 在其他情况下也有效)。
所以我的意思是:你应该使用
<?php

header
('Location: http://www.example.com/');
die();

?>
因为所有 die 函数的作用都是停止脚本,没有其他地方可以进行解释,并且你选择中断脚本操作的作用域很快就被完成了!

在其他示例和你的脚本的小部分的正确选择中有很多情况,当你在编写你的 php 框架时,这些选择会产生差异!

感谢 Rasmus Lerdorf 和他的团队完成了非常规 php 功能的部分工作,php 7 roolez!!!!!
scott at lucentminds dot com
15 年前
如果您想删除一个头信息并防止它作为头信息响应的一部分发送,只需在头信息名称后提供空值作为头信息值即可。例如...

PHP 默认情况下始终返回以下头信息

"Content-Type: text/html"

您的整个头信息响应将如下所示

HTTP/1.1 200 OK
Server: Apache/2.2.11 (Unix)
X-Powered-By: PHP/5.2.8
Date: Fri, 16 Oct 2009 23:05:07 GMT
Content-Type: text/html; charset=UTF-8
Connection: close

如果您像这样调用没有值的 header 名称...

<?php

header
( 'Content-Type:' );

?>

您的头信息现在如下所示

HTTP/1.1 200 OK
Server: Apache/2.2.11 (Unix)
X-Powered-By: PHP/5.2.8
Date: Fri, 16 Oct 2009 23:05:07 GMT
Connection: close
Anonymous
15 年前
我只是想补充一点,因为我在这里看到了很多格式错误的头信息。

1. 所有使用的头信息都将首字母大写,因此您必须遵循此规则。例如

Location,而不是 location
Content-Type,而不是 content-type,也不是 CONTENT-TYPE

2. 然后必须有冒号和空格,例如

正确:header("Content-Type: text/plain");
错误:header("Content-Type:text/plain");

3. Location 头信息必须是包含方案、域名、端口、路径等的绝对 URI。

正确:header("Location: http://www.example.com/something.php?a=1");

4. 不允许使用相对 URI

错误:Location: /something.php?a=1
错误:Location: ?a=1

这将使代理服务器和 HTTP 客户端更快乐。
mzheng[no-spam-thx] at ariba dot com
16 年前
对于大型文件(100 MB 以上),我发现尽快刷新文件内容至关重要,否则下载对话框很长时间才会显示或根本不会显示。

<?php
header
("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.

$fp = fopen($file, "r");
while (!
feof($fp))
{
echo
fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
?>
Vinay Kotekar
9 年前
以 ANSI 格式保存 php 文件没有问题,但是出于各种原因以 UTF-8 格式保存文件时,请记住在保存文件时不要使用任何 BOM(字节顺序标记)支持。
否则,您将遇到头信息未正确发送的问题
例如。
<?php header("Set-Cookie: name=user");?>

会给出类似这样的结果:

警告:无法修改头信息 - 头信息已由 (输出开始于 C:\www\info.php:1) 在 C:\www\info.php 第 1 行发送
Cody G.
14 年前
经过大量的研究和测试,我想分享一下我关于 Internet Explorer 和文件下载问题的发现。

看看这段代码,它复制了 Javascript 的正常下载

<?php
if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
header("Content-type: text/javascript");
header("Content-Disposition: inline; filename=\"download.js\"");
header("Content-Length: ".filesize("my-file.js"));
} else {
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=\"download.js\"");
header("Content-Length: ".filesize("my-file.js"));
}
header("Expires: Fri, 01 Jan 2010 05:00:00 GMT");
if(
strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
header("Cache-Control: no-cache");
header("Pragma: no-cache");
}
include(
"my-file.js");
?>

现在让我解释一下

首先,我检查是否为 IE 浏览器,如果不是 IE,则将 Content-type(区分大小写)设置为 JS,并将 Content-Disposition(从现在起,所有头部信息都区分大小写)设置为 inline,因为大多数非 IE 浏览器都喜欢内联显示 JS。(用户可以更改设置)。某些浏览器需要 Content-Length 头部信息才能激活下载框。然后,如果是 IE,有时需要使用 "application/force-download" Content-type 来显示下载框。如果您不希望 PDF 在浏览器中显示(在 IE 中),请使用此方法。我在这里使用它来确保下载框打开。无论如何,我将 Content-Disposition 设置为 attachment,因为我已经知道下载框会显示。然后我再次设置 Content-Length。

现在,这是我的重点。只有在非 IE 浏览器的情况下,才会发送 Cache-Control 和 Pragma 头部信息。**这些头部信息会阻止 IE 浏览器下载!!!** 始终只使用 Expires 头部信息,毕竟,它需要在下一次下载时重新下载文件。这不是错误!IE 会将下载的文件存储在“临时 Internet 文件”文件夹中,直到下载完成。我知道这一点,因为我曾经将一个大型文件下载到“我的文档”,但是下载对话框将其放在 Temp 文件夹中,并在最后将其移动。仔细想想。如果 IE 需要将文件下载到 Temp 文件夹,则设置 Cache-Control 和 Pragma 头部信息会导致错误!

希望这能为某些人节省一些时间!
~Cody G.
Angelica Perduta
4 年前
我编写了一个脚本,用于生成可在网页上使用的优化图像,该脚本使用 404 脚本调整和缩小原始图像大小,但在某些服务器上,它生成了图像,但由于某个地方的 404 状态缓存,导致没有使用该图像。我设法使用以下方法使其工作,尽管我不太理解它,但我希望我的帖子能帮助遇到类似问题的其他人。

header_remove();
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// ... 然后尝试重定向
// 201 = 请求已完成,导致创建了一个新资源,但它仍然没有加载
// 302 "临时移动" 似乎可以加载它!
header("location:$dst", FALSE, 302); // 重定向到我们现在拥有的文件
To Top