Apache 服务器 – 尝试在 .htaccess 中使用 Location 指令

Apache 服务器 – 尝试在 .htaccess 中使用 Location 指令

当我的网站上调用特定路径 (/foo/bar/) 时,我需要删除所有缓存。我的托管支持告诉我应该在 .htaccess 中执行此操作,并且我尝试使用 Location 指令,如下所示:

<Location "/foo/bar/">
  Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</Location>

但我得到的只是内部服务器错误。我是否遗漏了某些内容,或者是否应该将此指令放在 .htaccess 中的某个位置。我尝试了所有能想到的方法,但结果都一样。

答案1

正如前面提到的,文件<Location>中不允许使用该指令.htaccess。如果/foo/bar/直接与文件系统目录相关,那么您可以将.htaccess文件放在该目录中,以便仅将指令(Header在本例中)应用于该目录及其下层目录。

但是,如果/foo/bar/仅仅是一个 URL 路径(这也是该<Location>指令在服务器上下文中的目标),并且与文件系统没有直接关系,那么您可以在访问该 URl 路径时设置一个环境变量,并Header根据该环境变量是否设置有条件地进行设置。

例如:

SetEnvIf Request_URI "^/foo/bar/$" NO_CACHE
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" env=NO_CACHE

上述代码在请求URL 路径(仅)时设置环境变量NO_CACHE(为值),并且仅在设置该环境变量(通过最后一个参数)时才应用该指令。1/foo/bar/Headerenv=NO_CACHE


或者,如果你使用的是 Apache 2.4+,那么你可以使用Apache<If>表达式直接定位该 URL 路径,无需设置环境变量。例如:

<If "%{REQUEST_URI} =~ m#^/foo/bar/$#">
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</If>

另一种选择是,如果你使用的是 Apache 2.4.10+,那么你可以使用阿帕奇表达式直接在Header指令中,以便仅针对该 URL 路径。例如:

Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" "expr=%{REQUEST_URI} =~ m#^/foo/bar/$#"

答案2

根据Apache 文档,该指令根本Location无法在文件中使用。您可以在服务器配置中使用,但文件始终引用文件所在的当前目录,因此为该文件中的另一个位置指定指令是没有意义的。.htaccessLocation.htaccess

只需省略Location指令,其Header本身就应该适用于该目录/位置。

相关内容