在 apache 2.4 和 CentOS 7 中将未处理的路由重定向到 /

在 apache 2.4 和 CentOS 7 中将未处理的路由重定向到 /

CentOS 7 服务器在 上托管一个公共前端网站example.com,并在 上托管一个后端 API home.example.com。下面的记录VirtualHost成功地将请求定向example.com到前端,同时将后端请求定向到home.example.com。然而,对路径上的任意请求的请求example.com都会给出404错误。

需要对下面的配置进行哪些具体更改VirtualHost才能将请求example.com/anyPath get重定向到 example.com?

例如,请求http://example.com/home到达服务器的应该返回example.com

这里是VirtualHost

<VirtualHost www.example.com:80>
    ServerName www.example.com
    ServerAlias example.com
    ErrorLog /var/log/httpd/example_com_error.log
    CustomLog /var/log/httpd/example_com_requests.log combined
    DocumentRoot /var/www/example/public_html
</VirtualHost>

<VirtualHost home.example.com:80>
    ServerName home.example.com
    ErrorLog /var/log/httpd/example_home_com_error.log
    CustomLog /var/log/httpd/example_home_com_requests.log combined
    ProxyPass / http://public.ip.for.api:1234/ connectiontimeout=5 timeout=30
</VirtualHost>

答案1

如果您想重定向,可以将其添加到您的第一个VirtualHost指令中(使用适当的索引文件)。

RedirectMatch 302 ^/(?!index.html$).+ http://example.com

基本上,这意味着您正在匹配任何与 /index.html 不完全匹配且后跟一个或多个字符的内容。

您还可以使用它Rewrite来达到不同的效果。无论请求什么,Apache 都会提供索引文件。

RewriteEngine on
RewriteRule ^/.* index.html

答案2

实现这一结果的最简单、最干净且——在我看来——最正确的方法是:

<VirtualHost www.example.com:80>
    #...
    DirectoryIndex index.html     # This is likely already set globally
    FallbackResource /index.html  # Catchall for any undefined path (from Apache's point of view)
    #...
</VirtualHost>

FallbackResource的一大优点RedirectMatch模组重写基于的方法是,它是一个“一劳永逸”的设置,在添加新路由时可以继续工作,而无需更新此配置。与重定向不同,它也是 SPA 友好的,因为它保留了原始请求的路径。它本质上告诉 Apache 让后备资源处理从 Apache 的角度来看未定义的路由的任何请求。

相关内容