如何在重写之前根据原始 URL 应用一些 apache 指令?

如何在重写之前根据原始 URL 应用一些 apache 指令?

一般问题:

Apache 允许您将指令放在某个<Location>部分内,以便根据请求路径有选择地应用它们。还有 mod-rewrite,它允许您动态指定重写 URL 的规则。

从我的测试来看,当您的 URL 被 修改时RewriteRule,apache 会使用重写的 URL 来确定<Location>应应用哪些部分。有没有办法让 apache 根据 URL 有选择地应用指令已经RewriteRule转换 URL 了吗?

我的具体情况:

我有一个基于 Laravel 的 Web 应用程序,它使用“前端控制器”模式。所有不对应于现有文件的传入请求都会被重写为index.php,然后此脚本会处理该请求。这是通过文件中的类似规则实现的.htaccess

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

我想将一些 apache 指令仅应用于以 开头的请求/foo/。因此,正常的操作方式是将它们放在一个<Location "/foo/">部分中,例如:

<Location "/foo/">
    Header always set X-Foo on
</Location>

但是,当我发出请求时,/foo/bar我发现标头未设置。如果我改用,<Location "/index.php">则将应用指令并设置标头。但这对我来说没用,因为每一个URL 最终被重写为/index.php

有什么方法可以让我获得一组基于原始 URL/foo/bar而不是重写的 URL来应用的指令/index.php

答案1

您可以使用有条件地设置环境变量,然后使用或SetEnvIf测试变量来实现这一点。例如,<If>RewriteCond

SetEnvIf Request_URI ^/foo/ FOO=1
<If "%{ENV:FOO} == 1">
  Header always set X-Foo on
</If>

只要SetEnvIf比 更早出现,这种方法就有效RewriteRuleSetEnvIf 文档有详细信息。

您也可以尝试

<If "%{REQUEST_URI} =~ m#^/foo/#">
  Header always set X-Foo on
</If>

表达式。它可能会起作用。不幸的是,Apache 文档对这种事情并不清楚 - 表达式If是在任何 URL 重写之前还是之后进行评估。

相关内容