在 Amazon Linux 2 和 Apache 上将所有非根路由重定向到 index.html

在 Amazon Linux 2 和 Apache 上将所有非根路由重定向到 index.html

Amazon Linux 2 实例正在使用 Apache 托管 Angular 7 应用程序。 Angular 7 应用程序不仅包含index.html,还包含多个.js文件和一个名为assets.

我需要使用什么特定语法才能确保所有非指定路由的 Apache 请求都重定向到index.html位于DocumentRoot 请注意,所需的语法还需要允许在客户端浏览器加载时将目录.js中的所有文件和内容assets作为辅助请求index.html

例如,如果远程 Web 浏览器请求,我希望 Apache 以与Apache 响应请求相同的方式mydomain.com/randomCharacters返回。然后必须能够访问文件和子目录的内容。 index.htmlmydomain.comindex.htmlindex.html.jsassets

(在本例中,DocumentRoot是一个名为 的目录/var/www/mydomain.com/public_html。此外,该/var/www/mydomain.com/public_html目录还包括 1. index.html、2. 几个.js文件,以及 3. 一个assets包含图像等内容的子目录。)

我想在块RedirectMatch内部使用VirtualHost来保持配置尽可能干净。这就是我的想法。下面的内容需要如何修改?

<VirtualHost *:80>
    ServerName www.mydomain.com
    ServerAlias mydomain.com
    DocumentRoot /var/www/mydomain.com/public_html
    ErrorLog /var/www/mydomain.com/error.log
    CustomLog /var/www/mydomain.com/requests.log combined
    RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com  
</VirtualHost>


结果的法医分析:

当打开 Firefox 开发人员工具中的“网络”选项卡尝试上述操作http://mydomain.com时,我RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com在 中发出请求VirtualHost,结果是所有请求都/显示已给出304响应,而所有对命名文件(如脚本)的请求都显示为已给出响应样式表已给出302响应。

另外,当我查看html同一请求的页面源时,我发现 的内容index.html确实已正确提供,但浏览器仍为空,因为 中的代码index.html无法访问.js文件或子目录的内容assets

所以问题是RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com需要重写以允许文件.js和内容assets需要什么特定的语法来解决这个问题,以便 Apache 可以成功地为 Angular 7 应用程序提供服务,无论后面添加什么字符串http://mydomain.com

答案1

您可以在上下文RewriteRule中使用这样的VirtualHost内容:

RewriteEngine On
# if not a regular file
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
# and not a directory
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
# then rewrite to index.html
RewriteRule ^.*$ /index.html [L]

如果你想让你的配置“尽可能干净”,那么就不要做这样的事情,让 Apache 返回一个 HTTP 404,因为它应该。

相关内容