我有一个遗留应用程序,我想将其包装到一个新的 symfony 项目中。为了清楚地区分各个部分,我决定将整个遗留应用程序移动到文档legacy
根目录之外的文件夹中。
由于一些遗留脚本仍需要直接调用,因此我创建了一个别名并编写了一个 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
答案1
你可以更严格地限制你的RewriteRule
图案因此,要创建一个反向引用,通过仅匹配并包括文件扩展名来排除路径信息,并REQUEST_URI
在代换反而。
例如:
RewriteCond %{DOCUMENT_ROOT}/../legacy/public$1 -f
RewriteRule ^(.+\.php) /legacy_public%{REQUEST_URI} [PT,L]
$1
中的反向引用RewriteCond
测试字符串然后仅匹配直到并包括.php
,丢弃 URL 路径的其余部分。
假设您还有其他静态资源(JS、CSS 和图像)需要重写,因此您可以在上面的正则表达式中包含这些资源:
RewriteRule ^(.+\.(?:php|js|css|jpg|png)) /legacy_public%{REQUEST_URI} [PT,L]
或者,使用另一个“捕获全部”规则,就像您最初所做的那样(假设没有路径信息)。
这确实假设您没有包含“看起来像”文件扩展名中间 URL(不太可能)的合法 URL。