Apache-2.4
將路徑資訊與 RewriteRule 結合使用
我有一個遺留應用程序,我想將它封裝在一個新的 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(不太可能)。