仅限于PHP页面的自定义404错误页面。

5
我有一个Htaccess文件中配置了个性化的404页面。
ErrorDocument 404 /404.php

它能够正常工作,但会提取所有 .jpg、.js、.css 等文件...
我希望它只提取 .php 文件,并对其他文件返回普通的404错误。

我在任何地方都没有找到这个选项。

非常感谢您。


“it takes everything”是什么意思?404是任何HTTP请求未找到的响应代码,无论是PHP请求还是图像。 - Elzo Valugi
你可以尝试使用URL重写(mod_rewrite)来实现这个功能——将任何请求到不存在的.php文件的请求重定向到你自定义的404.php页面——这是可能的(仅需3或4行代码)。 - LazyOne
为什么你不想要那个? - Your Common Sense
@你的常识 我希望如果我在调用图像、JS或其他内容时犯了错误,控制台会显示一个错误 <!DOCTYPE html... 而不是 文件xxx未找到。当我们复制结构时,这样做非常让人困扰。 - user1040899
只有25个踩?你为什么停下了?累了吗?长大了?我认为你可以做得更好。 - gdoron
3个回答

5
不确定但可以试一下:
<Files ~ "\.php$">
    ErrorDocument 404 /404.php
</Files>

引用自文件指令文档:

<Files>指令根据文件名限制所包含指令的范围。


2
有几种可能的方法可以实现这一点,但我会选择以下其中一种方式:
您可以使用 @LazyOne 建议的 mod_rewrite,仅将带有 .php 扩展名的文件重定向到您的自定义文档:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f # Only redirect to error for files that don't exist
RewriteRule ^(.*)\.php$ /404.php [L]

或者您可以像以前一样将所有内容直接通过PHP错误处理程序进行处理,并使用PHP确定请求的资源是否为PHP脚本:

<?php

  if (strtolower(substr($_SERVER['SCRIPT_URL'], -4)) != '.php') {
    // If the requested resource does not have a .php extension, include the standard error doc and exit
    include '404.html';
    exit;
  }

  // Handle .php 404s here

这种方法的缺点是你可能需要重写标准错误文档,以便使用PHP获取动态信息并显示给用户,例如请求的资源路径。

1

利用$_SERVER['REQUEST_URI'],您可以轻松检查导致错误的文件结尾,然后如果不符合您的需求,抛出一个标准的404头部,或者渲染一个不同的404页面。

将此代码放入您的404.php文件中。

$bad_url = $_SERVER['REQUEST_URI'];
$bad_extension = substr(strrchr($bad_url,'.'),1);

if($bad_extension != "php"){
    //Not PHP
}else{
    //PHP
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接