Установить CORS-заголовки, если существует (кеш) файл - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующий конфигурационный файл .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} недоступно в этих условных выражениях?

Я пробовал так много вещей, и ни одна из них, казалось, не работала для чего-то такого тривиального.

Пожалуйста, помогите!

Заранее спасибо!

1 Ответ

0 голосов
/ 05 ноября 2018

Мы только что решили эту проблему.

Очевидно, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...