我有一个包含 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 服务器附带的证书属于此类别。