【发布时间】:2023-03-17 06:53:02
【问题描述】:
我正在从主域的子域调用登录方法,并且我制作了一个 CORS 中间件来处理它。但是它没有按预期工作。
我想检查请求是否来自特定域,所以我尝试这样做:
public function handle($request, Closure $next)
{
if(!isset($_SERVER['HTTP_REFERER']))
return $next($request);
$originalDomain = config('session.domain');
$parsedUrl = parse_url($_SERVER['HTTP_REFERER']);
$splitDomain = explode('.', $parsedUrl['host'], 2);
$subdomain = $splitDomain[0];
$domain = $splitDomain[1];
$subdomainValid = ($parsedUrl['host'] != $originalDomain) && ($originalDomain == $domain);
if(!$subdomainValid)
return $next($request);
$allowedUrl = $parsedUrl['scheme'] . '://' . $subdomain . '.' . config('session.domain');
return $next($request)
->header('Access-Control-Allow-Origin', $allowedUrl)
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
->header('Access-Control-Allow-Headers', 'Origin, x-requested-with, x-csrf-token');
}
但我遇到的问题是$_SERVER['HTTP_REFERER'] 有时不会返回我期望的值。它不应该返回请求的来源吗?
【问题讨论】:
-
'HTTP_REFERER' 将用户代理引向当前页面的页面地址(如果有)。这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。
-
好的,解决方案呢?
-
使用静态网址?
-
我有 3500 个子域,每个子域都可以调用一个登录方法。您如何建议使用静态网址:)
-
那么你需要像stackoverflow.com/a/27990162/1906356这样的东西
标签: php laravel cors middleware