Apache 2-将特定命名空间重新路由到 SPA 的 index.html

Apache 2-将特定命名空间重新路由到 SPA 的 index.html

我有一个从 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 空间映射。我最好的建议是先删除所有AliasRewriteRule指令,只留下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 指令的值。

相关内容