我们正在为不同的客户运行一个大型项目,每个客户都有自己的子域。如果使用了无效的子域,Apache 不应执行任何脚本。相反,应该显示错误页面。
在职的:
这是 zzz-default.conf,它是最后一个 VHOST,并且匹配所有未被其他 VHOST 捕获的查询。
<VirtualHost *:80>
ServerName project.example.com
ServerAlias *.project.example.com
Redirect 404 /
DocumentRoot /var/www/html/
ErrorDocument 404 "This Subdomain does not exist."
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
什么是不是在职的:
ErrorDocument 404 /404.html
该文件位于/var/www/html/
并包含纯 html,没有脚本。
我们的问题似乎是重定向规则,但我们需要它匹配所有子域并重写为/
。
如果我启用此功能并调用无效的子域,我会得到
未找到
该服务器上未找到所请求的 URL /。
此外,还遇到了 404 Not Found 错误尝试使用 ErrorDocument 来处理请求时。
有人知道为什么吗?
编辑:其他 VHOST 定义为
<VirtualHost *:80>
ServerName client.project.example.com
Header always append X-Frame-Options SAMEORIGIN
</VirtualHost>
Include /path/to/local/client/httpd-vufind.conf
像这样定义13个VHOST,然后zzz-default.conf
加载上面的内容。
答案1
问题在于重定向规则匹配所有内容,包括您的 ErrorDocument。解决方案非常简单,通过将远程 URL 设置为ErrorDocument
:
<VirtualHost *:80>
ServerName project.example.com
ServerAlias *.project.example.com
DocumentRoot /var/www/html/
ErrorDocument 404 http://project.example.com/404.html
</VirtualHost>
答案2
解决方案:
<VirtualHost *:80>
ServerName project.example.com
ServerAlias *.project.example.com
# CHANGED:
# return 404 for all requests expect 404.html
RedirectMatch 404 "^(/(?!404.html).*)"
# use custom 404 error document
ErrorDocument 404 /404.html
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
问题是,“Redirect 404 /” 阻止显示 404.html 本身(使用 ErrorDocument 语句配置)。错误消息表明了这一点:“此外,在尝试使用 ErrorDocument 处理请求时遇到 404 Not Found 错误。”