Назад | Перейти на главную страницу

Настройка Access-Control-Allow-Origin в .htaccess для протокола Https

У меня есть сайт с http и https. Я установил в .htaccess следующую строку, которая запускается для http.

Набор заголовков Access-Control-Allow-Origin "*"

Но с https я получаю эту ошибку.

На запрошенном ресурсе нет заголовка Access-Control-Allow-Origin. Происхождение 'https://dl.dropboxusercontent.com'поэтому не разрешен доступ.

Я безуспешно пробовал следующее.

Набор заголовков Access-Control-Allow-Origin "*" env = HTTPS

Любой способ установить заголовок Access-Control-Allow-Origin для https в .htaccess?

Вот мой полный .htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<IfModule mod_headers.c>
    Header always set Access-Control-Allow-Origin "*"
</IfModule>

Вот настройки моего виртуального хоста

<VirtualHost *:443>

    ServerAdmin admin@localhost
    DocumentRoot /var/www/html/domain

    ServerName domain.com

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

    SSLCertificateFile "/etc/pki/tls/private/domain.crt"

    SSLCertificateKeyFile "/etc/pki/tls/private/domain.key"

    SSLCACertificateFile "/etc/pki/tls/private/domain.ca-bundle.crt"

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

    ErrorLog logs/domain-error_log
    CustomLog logs/domain-access_log common


    <Directory "/var/www/html/domain">
        AllowOverride All
    </Directory>


</VirtualHost>

Любое решение?

Мне пришлось создать .php, чтобы я запрашивал файл через request.php? F = main.jpg вместо того, чтобы запрашивать его напрямую, например, domain.com/main.jpg

Это немного уродливая работа, но она работает. Конечно, мне пришлось добавить заголовок Access-Control-Allow-Origin вот так. Таким образом, мне не нужно указывать этот заголовок в файле .htaccess.

 if (isset($_SERVER['HTTP_ORIGIN']) && strpos($_SERVER['HTTP_ORIGIN'],'safedomain') !== false) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

        exit(0);
    }

Без полного .htaccess я точно не знаю, но когда в Apache выполняется дополнительная обработка, добавляется условие always может понадобиться:

Header always set Access-Control-Allow-Origin "*" 

В руководство объясняет это следующим образом:

Когда ваше действие является функцией существующего заголовка, вам может потребоваться указать условие всегда, в зависимости от того, в какой внутренней таблице был установлен исходный заголовок.
Таблица, соответствующая всегда используется как для локально сгенерированных ответов об ошибках, так и для успешных ответов. Также обратите внимание, что повторение этой директивы с обоими условиями имеет смысл в некоторых сценариях, потому что всегда не является расширением на успех относительно существующих заголовков:

  • Вы добавляете заголовок в локально сгенерированный неуспешный (не 2xx) ответ, такой как перенаправление, и в этом случае в конечном ответе используется только таблица, соответствующая always.

  • Вы изменяете или удаляете заголовок, созданный сценарием CGI, и в этом случае сценарии CGI находятся в таблице, соответствующей всегда, а не в таблице по умолчанию.

  • Вы изменяете или удаляете заголовок, сгенерированный некоторой частью сервера, но этот заголовок не обнаруживается условием при успешном завершении по умолчанию.

Вы используете самоподписанный сертификат?

http://dev.housetrip.com/2014/04/17/unleash-your-ajax-requests-with-cors/

Вы можете столкнуться с трудностями, когда запрос нацелен на HTTPS-сервер с использованием самоподписанных сертификатов. Возможный обходной путь - добавить сертификат в список доверенных. Сертификат, поставляемый с тонким веб-сервером, попадает в эту категорию.