我想创建一个自定义的404页面,但它不会发送404标题,它仍然会发送200 OK。
我的.htaccess将每个请求重定向到index.php。
video = (VideoView) findViewById(R.id.video);
new BackgroundAsyncTask().execute("link-to-the-video");
index.php使用包含的.php文件处理url。实际上,controller.php解析了URL,最后pasteContent.php包含了请求的.php内容文件。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.php [NC,L]
正如你所看到的,在有任何输出之前我已经尝试发送404-Header。
//Handle URL
require 'inc/controller.php';
//Paste <head>
require 'inc/site_header.php';
//Paste <body>
require 'inc/pasteContent.php';
//Paste footer
require 'inc/site_footer.php';
实际上我也尝试将//Parse the URL
function parse_path() {
[...]
return $path;
}
$path_info = parse_path();
$controller = $path_info['call_parts'][0];
//Does this page exist?
function contentFound($c){
$found = true;
switch ($c) {
[...]
default:
$found = false;
} return $found;
}
//If content does not exist -> 404
if(!contentFound($controller)) {
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
require 'inc/site_header.php';
require 'inc/pasteContent.php';
require 'inc/site_footer.php';
die();
}
置于我的index.php之上,我们将其重定向到但仍然发送200 OK。
我做错了什么?
答案 0 :(得分:1)
确保PHP尚未发送标题和内容(如果空格在<?php
之前,则开始发送)。
if (headers_sent($filename, $linenum)) {
echo "Headers sent in $filename on line $linenum\n";
exit;
}
如果你知道哪个文件在哪一行开始输出,你可能会看到,出了什么问题。
作为解决方法,您可以使用output buffering:
在index.php ob_start();
的顶部插入,PHP将等到脚本终止后再发送任何内容。
您可以像<?php
header("HTTP/1.0 404 Not Found");
?>
一样直接定义协议,也可以尝试使用http_response_code(404);
重置状态代码
答案 1 :(得分:1)
正如KIMB技术在他之前的answer中指出的那样,空白会导致这个问题。如果在任何PHP文件的开头都找不到任何可见的空格,那么它们上面可能会有一个不可见的空格。
有时,某些文件上会出现UTF-8 BOM(字节顺序标记)。它对文本编辑器是不可见的,但会混淆PHP头文件。
Google可以使用Bash,Powershell等方法删除适合您操作系统的操作系统。某些IDE(例如PhpStorm)直接提供删除。