2016-10-26 16 views
8

Я мало знаю о работе с файлами .htaccess. Я пытался исследовать. Так что, может быть, кто-то может помочь мне здесь. Я хочу разрешить https и http одновременно. Позволь мне объяснить.Работа с как http, так и https

HTTP работает, но сайт на HTTPS дает мне ошибку в консоли

XMLHttpRequest не может загрузить https://domain1.com/data.json. Заголовок заголовка «Access-Control-Allow-Origin» имеет значение «https://www.domain1.coms», которое не соответствует заданному началу. Происхождение 'https://www.domain1.com', следовательно, не допускается.

Если изменить «HTTP» в «HTTPS» он работает на веб-сайте по протоколу HTTPS, а затем веб-сайт HTTP не работает. Как разрешить оба одновременно?

Я надеюсь, что это имело какой-то смысл для вас, ребята! Спасибо за любую помощь!


Вот мой код:

<IfModule mod_headers.c> 
    SetEnvIf Origin "http(s)?://(www\.)?(domain.com|domain2.com|domain3.com|domain4.com|domain5.com)$" AccessControlAllowOrigin=$0$1 
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin 
    Header set Access-Control-Allow-Credentials true 
</IfModule> 
+1

Надеюсь, я понял это правильно, но если вы счастливы, что пользователи получают доступ к вашему сайту через 'http' или' https', вам фактически ничего не нужно делать в вашем '.htaccess'. Как правило, вы используете '.htaccess' для принудительного использования одного или другого или для определенных страниц и т. Д. Например, как wp-admin. Пользователь сможет набирать «http» или «https», и безопасная версия будет работать, если они захотят ее использовать. – Lag

+0

Спасибо за это! –

ответ

1

В другом ответ указал, $1 должны быть удалены, так как это s от https://, добавленного в конце URL, поэтому он должен быть изменен на:

SetEnvIf Origin "http(s)?://(www\.)?(domain.com|domain2.com|domain3.com|domain4.com|domain5.com)$" AccessControlAllowOrigin=$0 

Это удостоверится AccessControlAllowOrigin установлено на точное значение заголовка Origin.

Я думаю, что причина для http:// для работы иногда и https:// иногда связана с тем, что браузер, скорее всего, кэширует ответ с сервера. Поэтому вы должны либо ответить как http://, так и https://, или вы должны указать заголовок Vary: Origin, чтобы сообщить браузеру, что ответ зависит от заголовка Origin.

Я хотел бы также предложить изменения Header add к Header set, Header merge или Header append, поскольку mod_headers документации состояний:

add 
The response header is added to the existing set of headers, even 
if this header already exists. This can result in two (or more) 
headers having the same name. This can lead to unforeseen 
consequences, and in general set, append or merge should be used 
instead. 

Итак, мое предложение, чтобы указать Варах заголовок:

<IfModule mod_headers.c> 
    SetEnvIf Origin "http(s)?://(www\.)?(domain.com|domain2.com|domain3.com|domain4.com|domain5.com)$" AccessControlAllowOrigin=$0 
    Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin 
    Header set Access-Control-Allow-Credentials true 
    Header merge Vary Origin 
</IfModule> 

Или укажите и http:// и https://:

<IfModule mod_headers.c> 
    SetEnvIf Origin "https?://(www\.)?(domain.com|domain2.com|domain3.com|domain4.com|domain5.com)$" AccessControlAllowOrigin=$1$2 
    Header append Access-Control-Allow-Origin http://%{AccessControlAllowOrigin}e env=AccessControlAllowOrigin 
    Header append Access-Control-Allow-Origin https://%{AccessControlAllowOrigin}e env=AccessControlAllowOrigin 
    Header set Access-Control-Allow-Credentials true 
    Header merge Vary Origin 
</IfModule> 
1

Этот ответ, кажется, обеспечивают некоторые useful information on this. Однако похоже, что вы можете загружать контент с другого сайта из-за опечатки.

XMLHttpRequest не может загрузить https://domain1.com/data.json. Заголовок 'Access-Control-Allow-Origin' имеет значение 'https://www.domain1.coms', который не равен прилагаемому началу. Происхождение 'https://www.domain1.com' поэтому не допускается.

ДВА является .coms, убедитесь, что он запрашивает ресурс из нужного места, так что с .com вместо этого.

0

[Отвечаю здесь, потому что я не могу ответить на ответ @Daniel Джеймса.]

У меня такая же ситуация, как OP-х. «S» в конце «com» ​​не является опечаткой. Если изменить правило:

SetEnvIf Origin "http(s)?://(www\.)?(domain.com|domain2.com|domain3.com|domain4.com|domain5.com)$" AccessControlAllowOrigin=$0 

который без $ 1 в конце концов, он прекрасно работает с запросами от HTTPS страниц, но он блокирует те из HTTP.

Если я оставить $ 1, то HTTP из них работают, но не HTTPS.

[Позже править]

Я присуждение щедрот Виктора Jerlin, как его первое предложение работало для меня. Спасибо огромное!

1

Ну, есть способы сначала создать виртуальный хост. Чтобы сделать это, нужно внести изменения в файл http conf.

<VirtualHost *:80> 
ServerName 'http://www.domain1.com' 
DocumentRoot /var/www/your-domain-root 
</VirtualHost> 

<VirtualHost *:443> 
DocumentRoot /var/www/your-domain-root 
ServerName 'https://www.domain1.com' 
SSLEngine On 
SSLOptions +StrictRequire 
SSLCertificateFile /path/to/server.crt 
SSLCertificateKeyFile /path/to/server.key 
SSLProtocol TLSv1 
</VirtualHost> 

Во-вторых, мы можем сделать это с помощью htaccess. В htaccess мы можем использовать 301 переадресацию. Веб-сайт в ssl (http: //) будет нашим базовым сайтом, а сайт ssl (http: //) будет вторичным. Перенаправить все запросы с http: // на https: //. Для перенаправления вы можете использовать 301 переадресацию или mod_rewrite любой.

Дайте мне знать, если это было полезно.

Смежные вопросы