【问题标题】:Set CORS-headers if (cache) file exists如果(缓存)文件存在,则设置 CORS 标头
【发布时间】:2019-04-08 18:26:48
【问题描述】:

我有以下 .htaccess 配置将用户重定向到 API 响应的缓存版本:

RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^(.*)?/$ - [E=URL:$1]
RewriteCond %{DOCUMENT_ROOT}/cache/%{ENV:URL}.json -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/cache/%{ENV:URL}.json [L]

URL 环境变量设置为考虑可能存在或不存在的尾部斜杠。这部分工作完美,完成了它应该做的事情。

但是,由于请求是通过 AJAX 调用发出的,因此我们需要为这些情况设置 CORS 标头。如果没有缓存响应,请务必不要设置这些标头。

我尝试了以下方法,但都没有成功。

使用If 块:

RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^(.*)?/$ - [E=URL:$1] [PC]

<If "-f '%{DOCUMENT_ROOT}/cache/%{ENV:URL}.json'">
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Headers "Content-Type,Accept"
    Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
    Header set Access-Control-Expose-Headers "Content-Type,Content-Length"
</If>

使用setEnvIfExpr

RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^(.*)?/$ - [E=URL:$1] [PC]

setEnvIfExpr "-f '%{DOCUMENT_ROOT}/cache/${ENV:URL}.json'" USE_CACHE

Header set Access-Control-Allow-Origin "*" env=USE_CACHE
Header set Access-Control-Allow-Headers "Content-Type,Accept" env=USE_CACHE
Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS" env=USE_CACHE
Header set Access-Control-Expose-Headers "Content-Type,Content-Length" env=USE_CACHE

请注意,在这两种情况下,如果我将 %{ENV:URL} 替换为存在的硬编码文件,则标题将按照上一个示例中的预期设置。

由于某种原因,%{ENV:URL} 在这些条件表达式中不可用?

我一直在尝试很多东西,但似乎没有一个对这种微不足道的事情有用。

请帮忙!

提前致谢!

【问题讨论】:

    标签: apache .htaccess http-headers


    【解决方案1】:

    我们刚刚设法解决了这个问题。

    显然,mod_rewrite 和 mod_headers 是两个独立的模块,它们以“错误”的顺序运行以使上述代码正常工作。

    这就是我们为其他需要此问题的人解决问题的方法:

    # Redirect to a cached version of the resource if its available.
    RewriteCond %{REQUEST_METHOD} GET
    RewriteRule ^(.+)$ - [E=MY_CACHED_URL:%{DOCUMENT_ROOT}/cache/$1.json]
    RewriteRule ^(.+)/$ - [E=MY_CACHED_URL:%{DOCUMENT_ROOT}/cache/$1.json]
    RewriteCond %{ENV:MY_CACHED_URL} -f
    RewriteRule ^(.*) %{ENV:MY_CACHED_URL} [L]
    
    # Set CORS headers for cached results.
    SetEnvIfExpr "%{REQUEST_URI} =~ m#/cache/.+#" IS_CACHED=1
    Header set Access-Control-Allow-Origin "*" env=IS_CACHED
    Header set Access-Control-Allow-Headers "Content-Type,Accept" env=IS_CACHED
    Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS" env=IS_CACHED
    Header set Access-Control-Expose-Headers "Content-Type,Content-Length" env=IS_CACHED
    

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 2020-02-08
      • 2011-01-28
      • 2017-04-17
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多