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.comwww.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();
...
}