Php

Apache 將絕對 url 重定向到相對 url

  • September 27, 2018

所以我想從一個子文件夾載入一個網路應用程序。目前配置如下所示

<VirtualHost *:80>
   ServerName YOUR IP ADDRESS/DOMAIN

   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html/

   <Directory /var/www/html/monica/public/>
       Options Indexes FollowSymLinks
       AllowOverride All
       Require all granted

       # Everything under this line has been added by me to try to make the redirect work
       RewriteEngine  on
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteRule ^(.*)$           /var/www/html/monica/public/$1  [R]
   </Directory>

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

頁面服務正確,但由於文件包含絕對 url,它一直失敗。我對 Apache 很陌生,所以我不知道自己做錯了什麼,尋找答案是徒勞的。

如果我使 DocumentRoot/var/www/html/monica/public/它正常工作,但我想從子目錄訪問它,例如localhost/monica/

注意:這個 webapp 可以從基礎訪問(https://github.com/monicahq/monica/

我想我理解您現在所指的內容(儘管您如何引用資產的範例“絕對路徑”會很有用)。我假設您正在引用您的資產,例如/img/image.jpg(或https://example.com/img/image.jpg)?而實際資源位於/monica/public/img/image.jpg? 因此,您基本上需要將所有 URL(對於靜態資產)重寫到/monica/public子目錄。但這不會影響您的頁面間 URL 嗎?(除非您在頁面之間僅使用相對URL?)

例如,代替您現有的<Directory>塊,嘗試以下操作。請注意Directory路徑引用您的文件根目錄。

<Directory /var/www/html>
   Options Indexes FollowSymLinks
   AllowOverride All
   Require all granted

   RewriteEngine  on
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule (.+\.(?:jpg|png|css|js))$ /monica/public/$1  [L]
</Directory>

檢查文件副檔名(靜態資產)的目的是避免對每個請求進行“文件存在”檢查(這是相對昂貴的)。

這假設您有一個.htaccess文件位於/monica/public/.htaccess(如您的文件結構中所示),然後路由請求。(否則,如果資產確實不存在,這可能會導致重寫循環。)

如果我使 DocumentRoot/var/www/html/monica/public/它正常工作,但我想從子目錄訪問它,例如localhost/monica/

然而,這聽起來你應該“修復”你的 URL 路徑(在 Laravel 中路由)而不是重寫你的資源?


更新:

你能告訴我我該怎麼做嗎?

我不確定,這似乎是 Laravel/PHP 問題?文件根目錄是/var/www/html/monica/public/(文件系統路徑),但您希望有效地從URL-path/monica中的子目錄提供內容。請注意,“monica”中的“monica”與 URL 中的“monica”不同。您可以將 webapp放在文件系統的子目錄中(因此絕對文件系統路徑將是),或者您將 webapp 中的所有 URL 更改為包含在 URL 路徑的開頭。/var/www/html/monica/public/``/monica``/var/www/html/monica/public/monica``/monica/

不管你怎麼做,你的 webapp 中的所有 URL(靜態資源和所有東西)都需要 start /monica。所以,除了在 Laravel 中修改路由之外,我沒有看到任何其他方法。

Apache 可以通過發出外部重定向來幫助內容從文件根目錄移動到子目錄。/monica但這只是為了 SEO 的好處,而不是讓您的使用者一直使用(速度較慢、伺服器負載增加等)。

如果我將其更改為…資產將再次停止載入。你知道為什麼嗎?

<Directory /var/www/html/monica>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted

    RewriteEngine  on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.+\.(?:jpg|png|css|js))$ /public/$1  [L]
</Directory>

因為(如果我在回答開始時的假設仍然正確)您正在引用您的資產,例如/img/image.jpgand not /monica/img/image.jpg

引用自:https://serverfault.com/questions/932752