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 的角度来看未定义的路由的任何请求。