我有一个从 Apache 2.4.29 HTTP 服务器提供服务的 Angular 10-SPA,并且除了过去让这个服务器运行并为 WSGI 应用程序服务器提供服务之外,实际使用 HTTP 服务器的经验非常少。由于该 HTTP 服务器还为我的后端(通过 WSGI 连接到我的数据库的 Django 应用程序服务器)提供服务,所以我的 SPA 并不是所有传入请求的接收者,只有以给定前缀开头的请求,例如www.mypage.com/prefix/
。我一直在尝试对其进行配置,以便基本上每个/prefix
在域后直接包含此前缀的 URL 都会由index.html
位于 中的SPA 提供服务frontendfolder
,希望它能立即开始为该特定路由构建页面。
我已经读完了Angular 文档关于使用 apache2 进行部署以及 apache2 的文档重写规则和重写条件指令。这是我的 sites-available/mypage.conf 中的内容。Directory-tag 中的所有内容都是从 angular.io 复制粘贴过来的:
DocumentRoot /path/to/frontendfolder
#DocumentRoot is not a typo, I'm not sure if DOCUMENT_ROOT calls that variable or not,
#but there is nothing else called like it in neither the mypage.conf file, nor
#apache2.conf, nor envvars
Alias /prefix /path/to/frontendfolder
Alias /prefix/ /path/to/frontendfolder/index.html
<Directory /path/to/frontendfolder>
Require all granted
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^/prefix - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^/prefix /index.html
</Directory>
这样,当我访问 URL 时,至少可以加载 index.html mypage.com/prefix
。如果我访问 mypage.com/prefix/page1 并点击刷新,就会出现 Apache 的“404 Not Found”。
我的配置有什么问题?我以为这RewriteRule ^/prefix /index.html
会将以 /prefix 开头的所有内容路由到我的 index.html,除非此 URL 指向有效文件,那么为什么没有发生这种情况?
答案1
您的配置看起来 - 请原谅 - 很混乱。
正确的,文档根目录不是拼写错误。这是一条基本的 Apache 指令,它将 URL 空间映射到您的文件系统中。因此,它告诉 Apache 去哪里回答请求,除非您使用 Alias、RewriteRule 或其他东西覆盖它。
我不确定你到底想要实现什么 URL 空间映射。我最好的建议是先删除所有Alias
和RewriteRule
指令,只留下DocumentRoot
。然后看看这是否能给你想要的 URL 映射。例如,只需
DocumentRoot /path/to/frontendfolder
然后请求example.com/prefix
将被路由到/path/to/frontendfolder/prefix
您的文件系统。如果这是一个目录,并且其中包含例如文件 index.html,则请求将由 回答/path/to/frontendfolder/prefix/index.html
。
这是起点。如果它不能满足你的需求,那么你可以开始在需要的地方覆盖它,使用别名和 RewriteRule 指令。Alias 更简单、更基础,因此请先尝试使用它,然后针对更复杂的需求再使用 RewriteRule。
祝你好运!
顺便说一句,虽然 RewriteCond 的文档提到了DOCUMENT_ROOT
,但没有说明它的值是什么。但我们可以假设它是 DocumentRoot 指令的值。