REGEX никогда не подходит для Origin в .htaccess - PullRequest
4 голосов
/ 02 июня 2019

У меня есть 10 поддоменов, и я получаю все статические файлы из поддоменов (static.88n8.com).

Я хочу разрешить перекрестный источник для всех поддоменов в .htaccess с помощью этого:

SetEnvIf Origin "^http(s):\/\/(www\.google.com|google\.com|88n8\.com|second\.88n8\.com|third\.88n8\.com|fourth\.88n8\.com)$" OriginDomainStr=$0
Header add Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr

Или вот этот:

SetEnvIf Origin "^http(s):\/\/(www\.google.com|google\.com|88n8\.com|second\.88n8\.com|third\.88n8\.com|fourth\.88n8\.com)$" OriginDomainStr=$0
Header set Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr

Или вот этот:

SetEnvIf Origin "^http(s):\/\/(www\.google.com|google\.com|88n8\.com|second\.88n8\.com|third\.88n8\.com|fourth\.88n8\.com)$" OriginDomainStr=$0
Header always set Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr

И консоль, показывающая мне:

Access to font at 'https://static.88n8.com/font.woff' from origin 'https://88n8.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Что очень странно,Это регулярное выражение должно совпадать, но, похоже, оно совсем не совпадает.

Я попробовал этот, чтобы проверить, могу ли я установить заголовок, и это сработало для основного домена:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "https://88n8.com"
</IfModule>

Донне хотите использовать * или один домен.Почему мои регулярные выражения никогда не совпадают в .htaccess?Кажется, мой тест на регулярные выражения в порядке.

Отказ от ответственности: 88n8.com - это пример того, как мой домен включает в себя цифры и английские символы.Это не мой настоящий домен, и я не владею им.

Редактировать 1

Как вы можете видеть в моем REGEX, его следует применять ко всем88n8.com поддоменов и google.com (с https или http).Я включил только 4 субдомена в свой REGEX, чтобы показать вам мой REGEX.

Редактировать 2

Я добавил этот код на свои страницы PHP, чтобы узнать текущее происхождение:

echo (isset($_SERVER['HTTP_ORIGIN']))? $_SERVER['HTTP_ORIGIN'] : 'NOT SET';

и результат NOT SET.Похоже, мой Origin пуст или равен NULL, и по этой причине REGEX никогда не совпадает.

Редактировать 3

Я проверил IP-адрес сервера с помощью IP2Proxy.Это результат обнаружения прокси:

Proxy Detection Result

Изменить 4

Я пытался выбрать что-нибудь, новсе еще нет шансов с этими двумя REGEX:

SetEnvIf Origin "." OriginDomainStr=$0
Header add Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr
SetEnvIf Origin "^(?![\s\S])" OriginDomainStr=$0
Header add Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr

Как я могу увидеть значение Origin напрямую?

1 Ответ

2 голосов
/ 02 июня 2019

Вы получаете доступ с static субдомена. Это не относится к утвержденным поддоменам.

Также он не будет соответствовать http из-за (s). Чтобы сделать его необязательным, измените http(s) на https? (это делает необязательным s). Это также должно решить все остальное, потому что, когда вы создаете группу совпадений с (s), ваша переменная $ 0 будет s, а не доменом, который вы хотели.

Я бы также предложил объединить субдомены.

^https?:\/\/((www\.)?google\.com|(first|second|third|fourth|static)\.88n8\.com)$

Все субдомены и основной домен из 88n8.com и google.com

^https?:\/\/((www\.)?google\.com|(.+\.)?88n8\.com)$

...