我对使用.htaccess文件了解不多。我尝试过研究。所以,也许有人可以帮助我在这里。我想同时允许https和http。让我解释一下。
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>
答案 0 :(得分:2)
正如另一个答案所指出的那样,$1
应该被移除,因为s
的{{1}}被附加到网址的末尾,因此应该更改为:
https://
这样可以确保将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
所以,我的建议是指定Vary标题:
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://
答案 1 :(得分:1)
这个答案似乎提供了一些useful information on this。但是,由于输入错误,您可能会尝试从其他网站加载内容。
XMLHttpRequest无法加载https://domain1.com/data.json。该 'Access-Control-Allow-Origin'标头有一个值 'https://www.domain1.coms' 不等于提供的来源。 因此,不允许原点“https://www.domain1.com”访问。
TLD为.coms
,请确保它从正确的位置请求资源,因此请改为.com
。
答案 2 :(得分: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 any。
让我知道它是否有用。
答案 3 :(得分:0)
[我在这里回复是因为我无法回复@Daniel James的答案。]
我和OP的情况相同。 &#39;&#39;在&#39; com&#39;结束时不是拼写错误。 如果我将规则更改为:
SetEnvIf Origin "http(s)?://(www\.)?(domain.com|domain2.com|domain3.com|domain4.com|domain5.com)$" AccessControlAllowOrigin=$0
最后没有$ 1,它适用于来自 https 页面的请求,但它会阻止 http 中的请求。
如果我退出$ 1, http 可以使用 https 。
[稍后编辑]
我向Victor Jerlin颁发奖金,因为他的第一个建议对我有用。非常感谢你!