使用路径信息与 RewriteRule 结合使用

使用路径信息与 RewriteRule 结合使用

我有一个遗留应用程序,我想将其包装到一个新的 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。

相关内容