PHP返回200 OK状态标头而不是SSL上的404错误

时间:2017-12-08 19:05:48

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

我有这个php脚本(test.php),它检查页面是否存在于mysql中,它应该返回404状态标题,但它返回200 OK状态。这会导致控制台中的软404错误。

我试图修复,但它根本不起作用。这是我的.htaccess。几个月前我将我的网站迁移到了SSL,我将所有流量从端口80重定向到https。

RewriteEngine On
ErrorDocument 404 /404.shtml

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

RewriteEngine on
RewriteRule ^([0-9]+)-([0-9]+)-([0-9]+)/pressrelease([0-9]+)\.htm$ test.php?pressid=$4 [L]

这是我的test.php

<?php 
include_once('dbc.php');       

$pid = strip_tags(mysql_real_escape_string($_GET['pressid']));

$rs_dirs = mysql_query("select id,name from categories order by name") or die(mysql_error());

$rs_press = mysql_query("select *
                             from press 
                             where id = '$pid'
                             and approved='1'
                             ") or die(mysql_error());;

$total = mysql_num_rows($rs_press);


if (mysql_num_rows($rs_press) == 0) {

header("HTTP/1.1 404 Not Found");
include '404.shtml';
die();
}

这里有什么问题,如何解决?

2 个答案:

答案 0 :(得分:2)

您没有将实际状态代码设置为404。

请参阅header函数的用法:

http://php.net/manual/en/function.header.php

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

您的代码应为:

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

还有另一种功能:

https://secure.php.net/manual/en/function.http-response-code.php

http_response_code(404);

我更喜欢使用上面的功能。因为你的意图方式更加冗长。

答案 1 :(得分:0)

在您的代码中使用此代码:

if (mysql_num_rows($rs_press) == 0) {
   http_response_code(404);
   //and another staff here
}