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

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

我有一個 Angular 10-SPA,透過 Apache 2.4.29 HTTP 伺服器提供服務,並且在過去,我對 HTTP 伺服器的實際經驗很少,只是讓這個伺服器運行並為 WSGI 應用程式伺服器提供服務。由於該HTTP 伺服器也為我的後端提供服務(透過WSGI 的Django 應用程式伺服器透過Django-Rest-Framework 連接到我的資料庫),因此我的SPA 並不是所有傳入請求的接收者,而只是以給定前綴開頭的請求的接收者,例如www.mypage.com/prefix/。我一直在嘗試對其進行配置,以便基本上每個/prefix在網域之後直接具有此內容的 URL 都可以提供給index.html位於 中的SPA frontendfolder,希望隨後立即開始為該特定路由建立頁面。

我已經讀過角度文檔關於使用 apache2 進行部署以及 apache2 的文檔重寫規則重寫條件指令。這是我的 site-available/mypage.conf 中的內容。目錄標籤中的所有內容都是來自 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 指令的值。

相關內容