在 .htaccess 中为 Https 协议设置 Access-Control-Allow-Origin

在 .htaccess 中为 Https 协议设置 Access-Control-Allow-Origin

我有一个包含 http 和 https 的网站。我在 .htaccess 中设置了以下用于 http 的行。

标头设置 Access-Control-Allow-Origin“*”

但是使用 https 时出现此错误。

所请求的资源上不存在“Access-Control-Allow-Origin”标头。Origin'https://dl.dropboxusercontent.com' 因此不允许访问。

我尝试了以下操作,但没有成功。

标头设置 Access-Control-Allow-Origin “*” env=HTTPS

有没有办法在 .htaccess 中为 https 设置 Access-Control-Allow-Origin 标头?

这是我的完整 .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>

有什么解决办法吗?

答案1

如果没有完整的 .htaccess,我不太清楚,但是当 Apache 中完成更多处理时,always可能需要添加条件:

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

手动的解释如下:

当你的操作是现有标头的函数时,你可能需要指定一个条件总是,具体取决于原始标题设置在哪个内部表中。
对应于总是用于本地生成的错误响应以及成功响应。另请注意,在某些情况下,在两种条件下重复此指令是有意义的,因为总是不是的超集成功对于现有标题:

  • 您正在向本地生成的非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与始终相对应的表。

  • 您正在修改或删除由 CGI 脚本生成的标头,在这种情况下,CGI 脚本位于始终对应的表中,而不是在默认表中。

  • 您正在修改或删除由服务器某个部分生成的标头,但默认的成功条件未找到该标头。

答案2

我必须创建一个 .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);
    }

答案3

您使用自签名证书吗?

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

当请求针对使用自签名证书的 HTTPS 服务器时,您可能会遇到困难。一种可能的解决方法是将证书添加到您的受信任列表中。精简 Web 服务器附带的证书属于此类别。

相关内容