Apache-Httpd

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

  • May 6, 2019

Amazon Linux 2 實例正在使用 Apache 託管 Angular 7 應用程序。Angular 7 應用程序不僅包括index.html,還包括幾個.js文件和一個名為assets.

我需要使用什麼特定語法來確保所有非指定路由對 Apache 的請求都被重定向到index.html位於DocumentRoot? 請注意,所需的語法還需要允許在載入客戶端瀏覽器時.js將目錄的所有文件和內容assets作為輔助請求index.html

例如,如果遠端 Web 瀏覽器請求mydomain.com/randomCharacters,我希望 Apache 以index.html與 Apache 響應對mydomain.comwith的請求相同的方式返回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.comRedirectMatch 302 ^/(?!index.html$).+ http://mydomain.comVirtualHost結果是所有請求/都顯示已給出304響應,而對命名文件(如腳本)的所有請求並且樣式表顯示已給出302響應。

此外,當我查看html同一請求的頁面源時,我看到index.html確實正確地提供了內容,但瀏覽器仍然為空,因為其中的程式碼index.html無法訪問.js文件或assets子目錄的內容。

所以問題是RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com需要重寫以允許.js文件和assets子目錄的內容。 **解決這個問題需要什麼特定的語法,以便 Apache 可以成功地為 Angular 7 應用程序提供服務,無論在http://mydomain.com**之後添加什麼字元串?

您可以在上下文中使用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,因為它應該。

引用自:https://unix.stackexchange.com/questions/517471