Ssl

在 .htaccess 中為 Https 協議設置 Access-Control-Allow-Origin

  • March 1, 2016

我有一個帶有 http 和 https 的網站。我在 .htaccess 中設置了為 http 執行的以下行。

標頭集 Access-Control-Allow-Origin “*”

但是使用 https 我得到了這個錯誤。

請求的資源上不存在“Access-Control-Allow-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>

有什麼解決辦法嗎?

我必須創建一個 .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 "*" 

手冊解釋如下:

當您的操作是現有標頭的函式時,您可能需要指定條件always,具體取決於原始標頭設置在哪個內部表中。與always

對應的表用於本地生成的錯誤響應以及成功回應。另請注意,在某些情況下,在這兩個條件下重複此指令是有意義的,因為相對於現有標頭,它始終不是onsuccess的超集:

  • 您正在向本地生成的非成功(非 2xx)響應(例如重定向)添加標頭,在這種情況下,最終響應中僅使用始終對應的表。
  • 您正在修改或刪除由 CGI 腳本生成的標頭,在這種情況下,CGI 腳本位於始終對應的表中,而不是預設表中。
  • 您正在修改或刪除由伺服器的某些部分生成的標頭,但預設的 onsuccess 條件未找到該標頭。

引用自:https://serverfault.com/questions/706719