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>
Author: Jacksonkr, 2020-02-21

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>
 1
Author: MrWhite, 2020-02-21 20:45:05