Access-Control-Allow-Origin OPENCART 无解
Access-Control-Allow-Origin OPENCART NO SOLUTION
我的网站出现问题,正如您在 opencart 中所知,我们有 config.php 可以处理 HTTP 请求,代码如下:
define('HTTP_SERVER', 'http://www.DOMAIN.com/');
define('HTTPS_SERVER', 'https://www.DOMAIN.com/');
如果我们进入网站 www. DOMAIN.com,网站将运行良好
但如果没有 www. 它将无法工作,例如:http://DOMAIN.com
并且如果我们将 www. 从 config.php 中删除,那么网站将运行良好。
我认为问题出在 Access-Control-Allow-Origin
我尝试在 .htaccess
中使用以下代码
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
通过添加以上代码,网站可以正常运行,但功能不全。
但问题仍然存在于 jquery-2.1.1.min.js
catalog/view/javascript/jquery/jquery-2.1.1.min.js
那么,请指导我如何使它们都适用?
例如:Domain.com和www.domain.com
配置 http://www.DOMAIN.com/ 后,将这些行放入位于 OpenCart 根文件夹中的 .htaccess 文件中。如果您没有该文件,则必须先创建它。
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [R=301,L]
这些规则会将所有非 www 流量重定向到您的域 www 版本,以避免跨域冲突。由于解释的冲突,您可能会遇到一些额外的困难,例如登录后会话丢失,以及由于不正确的回调 URL 设置,PayPal 检查我们后订单不完整。上面的配置应该可以解决所有提到的问题。
打开此文件:system/library/url。php
.并寻找 if ($this->ssl && $secure) {
删除这些代码(在 2 个位置)
'https://' . $_SERVER['HTTP_HOST'] .
您的代码块应如下所示:
if ($this->ssl && $secure) {
//$url = 'https://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
$url = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
} else {
//$url = 'http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
$url = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
}
请注意,我注释掉了原始代码,在其下复制,然后我删除了 'https://' 。 $_SERVER['HTTP_HOST']
可选:
刷新页面时,您会收到一堆 'Notice' 错误。采取这个额外的步骤:
打开 catalog/controller/startup/seo_url
替换:
return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
来自
return (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许访问来源“https://sx.xyz.com”。
我在 Ajax 响应中也遇到过与跨域数据交换类似的问题,如 错误未定义。但是 header 中的响应是 Status Code:200 OK
Failed to load https://www.Domain.in/index.php?route=api/synchronization/checkapikey:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://sx.xyz.in' is therefore not allowed access.
解决方案: 在我的例子中,我必须通过 Ajax 调用函数 checkapikey() 到其他域,并获得包含调用所在位置的数据的响应做了
if (($this->request->server['REQUEST_METHOD'] == 'POST') && isset($this->request->server['HTTP_ORIGIN'])) {
$this->response->addHeader('Access-Control-Allow-Origin: ' . $this->request->server['HTTP_ORIGIN']);
$this->response->addHeader('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
$this->response->addHeader('Access-Control-Max-Age: 1000');
$this->response->addHeader('Access-Control-Allow-Credentials: true');
$this->response->addHeader('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
$headers = getallheaders();
...
}
我的网站出现问题,正如您在 opencart 中所知,我们有 config.php 可以处理 HTTP 请求,代码如下:
define('HTTP_SERVER', 'http://www.DOMAIN.com/');
define('HTTPS_SERVER', 'https://www.DOMAIN.com/');
如果我们进入网站 www. DOMAIN.com,网站将运行良好 但如果没有 www. 它将无法工作,例如:http://DOMAIN.com
并且如果我们将 www. 从 config.php 中删除,那么网站将运行良好。
我认为问题出在 Access-Control-Allow-Origin
我尝试在 .htaccess
中使用以下代码Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
通过添加以上代码,网站可以正常运行,但功能不全。 但问题仍然存在于 jquery-2.1.1.min.js
catalog/view/javascript/jquery/jquery-2.1.1.min.js
那么,请指导我如何使它们都适用?
例如:Domain.com和www.domain.com
配置 http://www.DOMAIN.com/ 后,将这些行放入位于 OpenCart 根文件夹中的 .htaccess 文件中。如果您没有该文件,则必须先创建它。
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [R=301,L]
这些规则会将所有非 www 流量重定向到您的域 www 版本,以避免跨域冲突。由于解释的冲突,您可能会遇到一些额外的困难,例如登录后会话丢失,以及由于不正确的回调 URL 设置,PayPal 检查我们后订单不完整。上面的配置应该可以解决所有提到的问题。
打开此文件:system/library/url。php .并寻找 if ($this->ssl && $secure) {
删除这些代码(在 2 个位置)
'https://' . $_SERVER['HTTP_HOST'] .
您的代码块应如下所示:
if ($this->ssl && $secure) {
//$url = 'https://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
$url = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
} else {
//$url = 'http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
$url = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/.\') . '/index.php?route=' . $route;
}
请注意,我注释掉了原始代码,在其下复制,然后我删除了 'https://' 。 $_SERVER['HTTP_HOST']
可选: 刷新页面时,您会收到一堆 'Notice' 错误。采取这个额外的步骤: 打开 catalog/controller/startup/seo_url 替换:
return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
来自
return (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许访问来源“https://sx.xyz.com”。
我在 Ajax 响应中也遇到过与跨域数据交换类似的问题,如 错误未定义。但是 header 中的响应是 Status Code:200 OK
Failed to load https://www.Domain.in/index.php?route=api/synchronization/checkapikey:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://sx.xyz.in' is therefore not allowed access.
解决方案: 在我的例子中,我必须通过 Ajax 调用函数 checkapikey() 到其他域,并获得包含调用所在位置的数据的响应做了
if (($this->request->server['REQUEST_METHOD'] == 'POST') && isset($this->request->server['HTTP_ORIGIN'])) {
$this->response->addHeader('Access-Control-Allow-Origin: ' . $this->request->server['HTTP_ORIGIN']);
$this->response->addHeader('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
$this->response->addHeader('Access-Control-Max-Age: 1000');
$this->response->addHeader('Access-Control-Allow-Credentials: true');
$this->response->addHeader('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
$headers = getallheaders();
...
}