我正在尝试自定义 Apache - Ubuntu 12.04 LTS 中的所有状态代码(错误代码)。
我在浏览器上收到的错误代码为 414 的错误消息内容是:
请求URI太大
请求的 URL 长度超出了此服务器的容量限制。
我浏览了一下文件:
/etc/apache2/conf.d/localized-error-pages
要查看显示此错误的默认文件,我发现了以下行:
ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
当我浏览文件时
/usr/share/apache2/error/HTTP_REQUEST_URI_TOO_LARGE.html.var
我在浏览器上没有找到相同的消息!怎么回事?我在哪里可以找到默认消息来编辑它?我编辑了上述文件,浏览器上没有任何变化!
还有一件事,我如何定制这个错误以适应服务器上的两个不同的网站(每个网站都有不同的custom_error_414页面)
更新: 我删除了文件 localized-error-pages 上的注释,但是当我在文件 localized-error-pages 中添加任何路径时,输出并没有改变,例如:
ErrorDocument 414 /var/www/myproject/error.php
它不起作用,但是当我添加如下普通字符串时:
ErrorDocument 414 "Long Request"
它确实有效!请提供一些代码和详细信息,说明如何修复此问题以及如何为两个网站自定义 414 错误。
更新
以下是输出
wget -O- -S ...
--2014-05-02 21:02:26-- http://localhost/error//HTTP_PRECONDITION_FAILED.html.var
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:80... failed: Connection refused.
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 403 Forbidden
Date: Fri, 02 May 2014 21:02:26 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 1
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
2014-05-02 21:02:26 错误 403:禁止。
还有一件事,我将错误页面放在 /var/www/myproject/error.php 但是当我尝试时:
ErrorDocument 414 /var/www/myproject/error.php
它没有工作 :( 虽然
ErrorDocument 414 "Sorry, request is too long"
解决了!
怎么回事?为什么它不将我重定向到错误页面?
还有一件事,我需要为两个网站制作两个不同的页面,我该如何实现:
ErrorDocument 414 sites1 ==> /var/www/myproject1/error.php
ErrorDocument 414 sites2 ==> /var/www/myproject2/error.php
我想将错误页面放在 /var/www/project 文件夹中
如果您能给我发送直接的步骤以供参考,我将不胜感激,因为我不是经验丰富的系统管理员,而且我在互联网上找不到有关此内容的文档,它非常差。
编辑
谢谢您的详细回答,我已经按照您的步骤操作了,但是遇到了一些小问题,希望您能提供意见。
a. 以下是错误的配置文件/etc/apache2/conf.d/localized-error-pages
#Alias /error/ "/usr/share/apache2/error/"
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en cs de es fr it nl sv pt-br ro
ForceLanguagePriority Prefer Fallback
ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.vr
ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
ErrorDocument 410 /error/HTTP_GONE.html.var
ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
b. 我已经成功启用了这 3 个模块。
c. 我已复制:
cp -R /usr/share/apache2/error/include /usr/share/apache2/include_site1
还
cp -R /usr/share/apache2/error/include /usr/share/apache2/include_site2
d. 在site1
页面中的配置中:/etc/apache2/sites-available/site1
,我添加了:
Alias /error/include "/usr/share/apache2/error/include_site1"
Alias /error/ "/usr/share/apache2/error/"
e.apache2ctl configtest
语法 OK
f.重新加载Apache,加载没有错误。
g.wget -O- ..../error/HTTP_REQUEST_URI_TOO_LARGE.html.var
结果是:
HTTP request sent, awaiting response... 200 OK Length: 223 [text/html] Saving to: `STDOUT'
0% [ ] 0 --.-K/s [an error occurred while processing this directive]
The length of the requested URL exceeds the capacity limit for
this server. The request cannot be processed.
[an error occurred while processing this directive] 100%[==============================================================================================================================>] 223 --.-K/s in 0s
2014-05-04 17:48:33 (73.1 MB/s) - written to stdout [223/223]
h. 从浏览器中尝试:.../error/HTTP_REQUEST_URI_TOO_LARGE.html.var
与步骤 8 的结果相同,但在浏览器中
i. 当我尝试在浏览器中发出大量请求时,例如:
...../site1/sj7xlekrjsuglkehgigl.........,
我在浏览器上得到空输出,而在网络(F12)中,我可以看到 414 错误状态
我该如何让它工作?我需要为 414 错误提供代码 404,并且需要在每个网站上使用(包括)自定义 PHP 页面,即
/var/www/site1/not_found.php
编辑2
我已在可用的站点中添加了以下内容,但如果我在浏览器中输入长 URL,它不会将我重定向到 index.php 或 not_found.php 页面。我需要长 URL 错误 (414) 来引导我到 404 页面 :( 我真的很沮丧,我在网上找不到任何帮助。414 之类的错误不像 404 那样容易解决,它们是系统内置的。
404 对我来说很容易!但无法配置 414!!!
ErrorDocument 404 /not_found.php
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
例如在 sites-available 中下面的内容不起作用 ErrorDocument 414 /not_found.php
答案1
默认配置中本地化错误消息被注释掉。您需要修改文件localized-error-pages.conf
以启用本地化页面。这取决于启用的模块数量。
如果您从错误目录中获取文件,这些文件包含多种语言的响应。内容根据浏览器指定的语言确定。页眉和页脚位于 include 子目录中。
某些浏览器可能会使用自己的消息代替服务器提供的内容。尝试使用wget
、curl
或w3m
来测试输出。一旦您使用其中一个获得了正确的消息,请尝试使用您的浏览器。您的浏览器可能还缓存了上一次尝试的响应,因此您可能需要强制刷新或刷新浏览器缓存。
您可以对不同的站点使用不同的文件或使用服务器端包含来添加站点特定的信息。
错误页面的 URL 应采用 格式http://www.example.com/error/HTTP_NOT_FOUND.html
。
编辑:我正在从 Ubuntu 13.10 上的安装开始工作,但多年来配置一直很稳定。提供的页面需要别名、包含和协商。如果尚未启用它们,我相信您需要重新启动才能启用它们。该a2enmod
命令应该会告诉您它们是否已启用。
尝试使用wget -O- -S http://localhost/error//HTTP_PRECONDITION_FAILED.html.var
来验证页面是否可以提供。在此之前,不会提供错误页面。然后尝试使用w3m http://localhost/failing_URL
来测试输出。如果客户端不提供语言协商信息,错误页面似乎无法提供。
目录/usr/share/apache2/error/include
应包含消息的页眉和页脚。您可以使用Alias
指令更改读取这些文件的目录,以便根据站点进行自定义。您需要确保此指令出现在目录Alias
指令之前/error
。在站点配置中进行别名处理是合适的。例如:
Alias /error/include/ "/var/www/site/error/include/"
Alias /error/ "/usr/share/apache2/error/"
您可能需要使用 验证您的配置,apache2ctl configtest
看看是否收到任何警告。检查/var/log/apache2/errorlog
文件中的相关信息。如果您已启用它,服务器信息页面也有助于诊断正在发生的事情。
编辑:这是我的本地化错误页面配置的摘录,其中省略了几个错误文档。这对两个网站来说可能都是通用的,因为您需要修改的内容应该在 /errors/include 中
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<IfModule mod_alias.c>
#Alias /error/ "/usr/share/apache2/error/"
<Directory "/usr/share/apache2/error">
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en cs de es fr it nl sv pt-br ro
ForceLanguagePriority Prefer Fallback
</Directory>
ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.vr
ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
ErrorDocument 410 /error/HTTP_GONE.html.var
ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
</IfModule>
</IfModule>
</IfModule>:
使用以下命令验证所需模块是否已加载:
sudo a2enmod negotiation include alias
如果应该告诉您是否加载了任何模块,在这种情况下您将需要重新启动 apache。
复制每个站点的 error/include 子目录。编辑这些文件中的文件以修改错误页面。
sudo cp -R /usr/share/apache2/error/include /usr/share/apache2/include_site1
sudo cp -R /usr/share/apache2/error/include /usr/share/apache2/include_site2
将以下行添加到站点配置中(对于第二个站点,将 site1 更改为 site2):
Alias /error/include "/usr/share/apache2/error/include_site1"
Alias /error/ "/usr/share/apache2/error/"
检查配置并重新加载apache:
sudo apache2ctl configtest
sudo apache2ctl reload
验证页面是否加载。如果加载失败,则需要解决此问题。
wget -O- http://site1/error/HTTP_PRECONDITION_FAILED.html.var
wget -O- http://site2/error/HTTP_PRECONDITION_FAILED.html.var
尝试在本地使用w3m
(文本浏览器),因为wget
没有得到错误页面。
w3m http://site1/nopage
w2m http://site2/nopage
如果此方法有效,请尝试使用浏览器。您可能想尝试将首选语言设置为英语以外的语言,以查看语言差异如何起作用。
EDIT2:您可以像 WordPress 一样处理 php 索引页中的错误。这是通过重写规则将任何缺失的 URL 传递到索引页来完成的。(您需要处理索引页中的 404 条件。)我还没有测试过 WordPress 中未生成的任何情况。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
如果您想使用自己的 PHP 错误页面,请跳过上述所有步骤,只需在您的页面中添加错误文档设置即可。看来您只是想指示 apache2 使用您的页面,而不是让它切断 apache2 自定义页面。(您可以将同一个文档用于多个错误。)将这样的行添加到您的站点规范中。
ErrorDocument 404 /not_found.php
您可以读取和设置页面的状态。(在输出任何其他内容之前设置状态,因为您需要在写入标题之前设置状态。)来自 PHP 文档http响应代码:
<?php
http_response_code(404);
?>