在.htaccess重定向后通过PHP发送404标头

时间:2016-03-17 09:51:32

标签: php .htaccess redirect http-status-code-404

我想创建一个自定义的404页面,但它不会发送404标题,它仍然会发送200 OK。

的.htaccess

我的.htaccess将每个请求重定向到index.php。

video = (VideoView) findViewById(R.id.video);
new BackgroundAsyncTask().execute("link-to-the-video");

的index.php

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]

仔细看看controller.php:

正如你所看到的,在有任何输出之前我已经尝试发送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。 我做错了什么?

2 个答案:

答案 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)直接提供删除。