【问题标题】:Current setting up for apache/php will always return a 200 page instead of 404当前对 apache/php 的设置将始终返回 200 页而不是 404
【发布时间】:2021-01-10 16:02:18
【问题描述】:

更新:我添加了一个 404 错误文档:

<IfModule mod_rewrite.c>
RewriteEngine on
ErrorDocument 404 /new404.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]
</IfModule>

但一切都没有改变。

我的 apache sn-p 有问题:

RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]
</IfModule>

我创建了一个这样的 URL:

http://localhost:8888/en
http://localhost:8888/en/team
http://localhost:8888/en/anything

我这样调用我的 PHP 文件:

team-en.html.php
anything-en.html.php

这是因为我有不同的语言。

现在,这是我的 PHP 文件来显示它们:

$path = isset($_GET['path']) ? $_GET['path'] : false;
$path = strtolower($path);
$path = preg_replace("/[^a-z-\/]/", '', $path);
$parts = explode("/", $path);


if (is_array($parts) && isset($parts[1])) {
    if (file_exists(__DIR__ . '/processors/' . $parts[1] . '.php')) {
        $processor = $parts[1];
    }
    if (file_exists(__DIR__ . '/pages/' . $parts[1] . '-'. $language .'.html.php')) {
        
        $page = $parts[1];
    }
}

语言变量在哪里:

$language = 'en';

$languages = [];
$languages[] = 'en';
$languages[] = 'nl';
$languages[] = 'fr';

现在,由于某种原因,这不会返回 404 页面,只会返回 200 标头响应。

我想知道是否有人有设置 404 页系统的经验,我阅读了很多教程,但没有一个给我满意的答案。

提前谢谢你

【问题讨论】:

  • 给定的代码不包含任何引发 404 错误的信息 - 是否缺少任何您没有共享的内容,或者您​​是否希望任何其他组件会引发这样的错误?
  • 我以为 404 会由服务器自己处理,我是 apache 初学者。我之前添加过:ErrorDocument 404 /404.php 但它没有被使用,所以我在我的 php 代码中添加了一个 404 sn-p,例如:http_response_code(404);但它被用在每个页面上
  • 尼科说的。仔细想想 - 你告诉 Apache 将所有请求转发到 index.php。目前,无论您请求什么,这都会发生,并且您的 PHP 代码会愉快地处理它们。 http://localhost:8888/stackoverflow.com 将工作。如果你委托你的 PHP 来处理路由,它需要决定什么是 200 和 404,等等。
  • 是的,这是真的,现在它实际上正在工作,但是如何保持重定向并仅更改此重写规则:RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA] 我尝试了很多不同的解决方案,但我无法修复它
  • 这取决于您要达到的目标。大多数框架(eg Laravel 等)与您所做的几乎完全一样,然后由框架在适当的情况下返回 404。如果您只希望 PHP 处理某些 URL,请更新您的 RewriteRule 正则表达式以仅匹配它们。但是,例如,如果可用语言仅在 PHP 中可用(可能在 DB 中),那么您必须使用 PHP 来确定它是否是 404,如果是则返回一个。

标签: php apache file-not-found errordocument


【解决方案1】:

重写规则匹配 所有 路由。 Apache 不可能抛出 404 错误,因为它不知道您的应用程序在做什么。

您需要在 PHP 代码中检查是否应在应用程序本身中引发此类错误。如果子文件夹中的文件是合适的条件,你可以这样写:

if (is_array($parts) && isset($parts[1])) {
    if (file_exists(__DIR__ . '/processors/' . $parts[1] . '.php')) {
        $processor = $parts[1];
    }
    if (file_exists(__DIR__ . '/pages/' . $parts[1] . '-'. $language .'.html.php')) {
        $page = $parts[1];
    } else {
        http_response_code(404);
        die();
    }       
}

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2018-06-28
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2018-06-22
    • 1970-01-01
    • 2020-03-03
    相关资源
    最近更新 更多