---
layout: post
title: 如何给DiscuzX添加像原生一样的404页面
tags: [PHP, DiscuzX]
---

  简单的提高用户体验<!--more-->    
  
# 起因
  像现在的新网站，由于使用的引擎越来越先进，网站的路径看起来非常的不错，那些一般开发的时候把它叫做路由。   
  而过去的网站不一样，以前的网站程序大多都是以文件形式存在，访问的时候都是服务器程序去读取相对应的文件。像PHP算是有点年头了，尤其像我这种不喜欢用框架，就喜欢原生PHP的人更是如此。   
  但是以前也是有让访问的URL变得花里胡哨的办法的，一般我们把那个叫做伪静态，那个一般是由服务器程序根据规则把对应的路径重写成文件的物理地址。   
  不过也有不少引擎会把所有情况的路径重写到一个文件中，再由一个文件慢慢处理，其实这个已经算是路由了，像我之前写的[超简单反代](/2021/01/06/proxy.html)就是这样的，包括一些博客引擎，比如WordPress、Typecho等等，还有一些CMS也支持。   
  然而很遗憾的是，DiscuzX作为一款有年代的论坛引擎，它不会接收所有的请求到处理程序中去，这就导致了一个问题，那就是错误的请求不会由DiscuzX处理，而是由服务器程序处理。   
  所以DiscuzX在遇到路径404的问题时，就只是白底黑字，大大的写着404 Not Found而已，很丑，一般的处理方法也不过是自己单独整一个404页面，显得和网站风格很不匹配。   
  所以今天我要解决这个问题，让这种有年代的程序也显得稍微现代化一点点。   
  
# 解决方法
  其实解决这个问题很简单，调用DiscuzX的程序去生成这个页面就行了，所以以下就是生成这个页面的代码（因为是看着模板变量随便写的，可能有多余的代码，但反正能用）：   
```php
<?php
define('CURSCRIPT', '404');
require './source/class/class_core.php';
C::app()->init();
$navtitle = "提示信息"; 
$show_message = "抱歉，您访问的页面不存在";
$alerttype = 'alert_error';
$allowreturn = 1;
$param['msgtype'] = 1;
include template('common/showmessage');
```
  把这个文件保存为404.php，然后放到网站根目录就行了，然后再把服务器配置里的错误页面设置为这个文件，像Nginx的话可以在server段里加一句`error_page 404 /404.php;`就OK了。   
  
# 总结
  目前来看好像我见到的几乎所有论坛（即使不是DiscuzX），都没能做到404页面和网站完美融合，也许我是第一个写这种东西的人吗😀？这样就能很简单的提高特别情况下的网站体验了吧……
