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.html
mydomain.com
index.html
index.html
.js
assets
(在本例中,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,因为它应该。