fecmall 的 appserver 跨域配置支持多域名时,存在跨域bug,望修复

bug问题 · tgy3300 · 于 4年前 发布 · 1924 次阅读

appserver跨域配置支持多域名时,存在跨域问题,问题重现步骤如下

'appserver_cors' => [
    ....
    //域名请换成自己真实的
    'Origin' => ['http://127.0.0.1', 'http://127.0.0.2'],  
    
    //这样也有问题
    'Origin' => ['*'],
    ....
]
共收到 7 条回复
Fecmall#14年前 0 个赞

我先记录一下吧。

Fecmall#23年前 0 个赞

记录一下

Fecmall#33年前 0 个赞

这个问题,你自己调试解决吧。

有这样的需求,应该环境也搭起来了,自己调试找找问题原因。

vue部分有一段时间没搞了。

tgy3300#43年前 0 个赞

这个问题,始终解决不了,求助大佬,我自己跟了半天代码,,没找到问题出在哪????

markgo#53年前 0 个赞

没看代码, 跨域实现基本都是基于Allow-Control-Allow-Origin来的吧, 而Allow-Control-Allow-Origin是不支持多条记录的, NGINX上的实现通过设置MAP来匹配当前访问域名是否符合MAP上的域名,返回对应的域名作为Allow-Control-Allow-Origin的值。 比方: www.baidu.com 访问的时候,匹配到了就返回Allow-Control-Allow-Origin:www.baidu.com www.qq.com 访问的时候,匹配到了就返回Allow-Control-Allow-Origin:www.qq.com

而不是直接返回多条记录。 如果是在程序里实现,你拿下当前访问域名,匹配下是否包含在你设定的域名中,如果是就增加个header返回。如果不是就不返回Allow-Control-Allow-Origin。

markgo#63年前 0 个赞
public function getYiiAuthCors(){
	$protocol = (int)$_SERVER['SERVER_PORT'] == 80 ? 'http' : 'https';
	$domain = $protocol.'//'.$_SERVER['SERVER_NAME'];
	$cors_allow_headers = $this->getCorsAllowHeaders();
	$cors = $this->appserver_cors;
	$corsFilterArr = [];
	if (is_array($cors) && !empty($cors)) {
		if (isset($cors['Origin']) && $cors['Origin']) {
			if(stripos($domain,$cors['Origin']) === 0){
				$corsFilterArr[] = 'Access-Control-Allow-Origin: ' . $cors['Origin'];
			}
		}
		
		if (isset($cors['Access-Control-Allow-Headers']) && is_array($cors['Access-Control-Allow-Headers'])) {
			$cors_allow_headers = array_merge($cors_allow_headers, $cors['Access-Control-Allow-Headers']);
		}
		$corsFilterArr[] = 'Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, ' . implode(', ', $cors_allow_headers);    
		if (isset($cors['Access-Control-Allow-Methods']) && is_array($cors['Access-Control-Allow-Methods'])) {
			$corsFilterArr[] = 'Access-Control-Allow-Methods: ' . implode(', ',$cors['Access-Control-Allow-Methods']);
		}
		$corsFilterArr[] = 'Access-Control-Allow-Credentials: true';
	}
	
	return $corsFilterArr;
}

如果是HTTPS的话,需要注意$protocol的获取是否正确,如果获取不正确,建议nginx/httpd 增加下标记,程序里的判断修改下。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics