一般问题:
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
比 更早出现,这种方法就有效RewriteRule
。SetEnvIf 文档有详细信息。
您也可以尝试
<If "%{REQUEST_URI} =~ m#^/foo/#">
Header always set X-Foo on
</If>
看表达式。它可能会起作用。不幸的是,Apache 文档对这种事情并不清楚 - 表达式If
是在任何 URL 重写之前还是之后进行评估。