Apache-2.4

將路徑資訊與 RewriteRule 結合使用

  • June 14, 2019

我有一個遺留應用程序,我想將它封裝在一個新的 symfony 項目中。為了清楚地分開事物,我決定將整個遺留應用程序移動到legacy位於文件根目錄之外的文件夾中。

由於某些遺留腳本仍應直接呼叫,因此我創建了 Alias 並編寫了 RewriteRule:

Alias /legacy_public "C:\project_root\legacy\public"

RewriteEngine On
 RewriteCond %{DOCUMENT_ROOT}/../legacy/public%{REQUEST_URI}  -f
 RewriteRule ^(.*)$  /legacy_public$1 [PT,L]
[...]

只要不涉及路徑資訊,這就會起作用。例如,www.example.org/showLogo.php正確呼叫 URL 會檢查文件是否存在,重寫 URL 並執行腳本。

但是,該腳本需要一些路徑資訊數據才能正常工作。呼叫www.example.org/inc/showLogo.php/38上面的 RewriteCond 時不匹配,因為沒有名為showLogo.php/38.

在研究了文件之後,我不清楚我應該如何更改條件以便在測試之前丟棄 path_info-Part-f

您可以在您的RewriteRule 模式中更具限制性,以便通過僅匹配並包含文件副檔名來創建排除路徑資訊的反向引用,並在替換REQUEST_URI中使用完整的 URL 路徑(即。 )。

例如:

RewriteCond %{DOCUMENT_ROOT}/../legacy/public$1  -f
RewriteRule ^(.+\.php)  /legacy_public%{REQUEST_URI} [PT,L]

然後, TestString中的$1反向引用僅匹配 upto 和包括,丟棄 URL 路徑的其餘部分。RewriteCond .php

大概您還需要重寫其他靜態資源(JS、CSS 和圖像),因此您可以將這些包含在上述正則表達式中:

RewriteRule ^(.+\.(?:php|js|css|jpg|png))  /legacy_public%{REQUEST_URI} [PT,L]

或者,使用另一個“catch all”規則,就像您最初所做的那樣(假設沒有路徑資訊)。

這確實假設您沒有合法的 URL,其中包含“看起來像”文件副檔名中間 URL(不太可能)。

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