htaccess изменяет заголовки, ЕСЛИ URL-адрес заканчивается на "новости"
У меня есть страница wordress, которая разрешается в /mysite/news
, и я пытаюсь загрузить ее на другой сайт с помощью javascript. Это естественное нарушение cors, поэтому я устанавливаю cors в *, чтобы обойти проблему, ТОЛЬКО если URL-адрес /mysite/news
Однако следующее не работает. Я подозреваю, что REQUEST_URI на самом деле решает что-то вроде index.php?page=xxx
, но я не уверен. Как я могу обойти эту проблему cors?
<If "%{REQUEST_URI} =~ m#news\/?$#">
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
</If>
1 answers
Я подозреваю, что REQUEST_URI на самом деле решает что-то вроде
index.php?page=xxx
Да, похоже, что mod_rewrite обрабатывается до того, как вычисляется выражение Apache. Таким образом, URL-адрес уже был переписан на index.php
(фронт-контроллер WordPress), прежде чем мы сможем оценить запрошенный URL-адрес в выражении.
Однако мы можем обойти это, установив переменную среды "рано", используя SetEnvif
на основе запрошенного URL-адреса (который встречается перед mod_rewrite) и вместо этого проверьте наличие этого параметра в выражении. ОДНАКО дополнительная сложность заключается в том, что этот параметр env переименовывается/с префиксом REDIRECT_
после того, как URL-адрес был переписан (первый раунд обработки) на index.php
.
Например:
SetEnvIf Request_URI "news/?$" APPLY_CORS
<If "-n reqenv('REDIRECT_APPLY_CORS')">
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
</If>
SetEnvIf
устанавливает APPLY_CORS
env в "1"
, если регулярное выражение соответствует запросу.
Оператор -n
в выражении Apache просто проверяет, что возвращаемая строка не является пустой.
ОБНОВЛЕНИЕ: Альтернативой является проверка вместо переменной сервера THE_REQUEST
, которая содержит первую строку HTTP-запроса (например. GET /mysite/news HTTP/1.1
*1) и не меняется по мере перезаписи URL-адреса. Небольшое предостережение в этом заключается в том, что регулярное выражение может быть немного более сложным.
(*1 - THE_REQUEST
содержит необработанный URI в кодировке %, отправленный клиентом, строку запроса и все.)
Например, эквивалент выше (что позволяет использовать любую разумную строку запроса) было бы что-то вроде:
<If "%{THE_REQUEST} =~ m#news/?(\?[\w=&-]*)?\s#">
:
</If>