Apache 2.4 多个子域的 ErrorDocument

Apache 2.4 多个子域的 ErrorDocument

我们正在为不同的客户运行一个大型项目,每个客户都有自己的子域。如果使用了无效的子域,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 错误。”

相关内容