【问题标题】:Laravel Multi Tenant considers www part as subdomainLaravel Multi Tenant 将 www 部分视为子域
【发布时间】:2020-11-01 09:46:04
【问题描述】:

我正在 laravel 中构建一个多租户系统,每个子域都保存在数据库中。当访问子域时,从数据库中检查它是否存在,如果不存在则调用 abort(403)。方法如下:

路由/web.php

Route::group(array('domain' => '{subdomain}.example.com', 'middleware' => ['Subdomain']), function () {

    Route::get('/', 'IndexController@index');
}

中间件/子域.php

public function handle($request, Closure $next)
{
    if(Subdomains::where('subdomain', $request->subdomain)->count()==0){
        return abort(403);
    }else{
        return $next($request);
    }
}

但是当我访问www.example.com 时,www 也被视为子域并从数据库中检查,因为它在数据库中不存在并且还调用了 abort(403)。简而言之,我的网站没有通过www.example.com URL 访问。

在这个 Laravel 多租户系统中,有什么方法可以区分 www 和其他子域,或者有什么方法可以处理这个问题?

【问题讨论】:

  • 考虑在服务器级别设置 www --> no-www 重定向。
  • @ceejayoz ,是的,我已经在 .htaccess 文件中这样做了,但是当 url 是 https;// www,example.com 时,它仍然需要我进行子域检查,但是它工作得很好对于 HTTP_HOST (http;//www.example.com)
  • 这是一个服务器问题:yoast.com/how-to-remove-www-from-your-url

标签: php laravel web subdomain multi-tenant


【解决方案1】:

只需使用if 语句检查查询的子域是否为www

public function handle($request, Closure $next)
{
  if($request->subdomain != 'www') {
    if(Subdomains::where('subdomain', $request->subdomain)->count()==0){
        return abort(403);
    }else{
        return $next($request);
    }
  }
}

同样在您的 .htaccess 中,从域名中删除 www

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

【讨论】:

  • 感谢@Clement Sam,感谢您的友好回复,但 return $next($request) 部分仍将其带到子域部分,它刚刚删除了数据库检查
  • 您也可以使用 .htaccess 从 url 中删除 www
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 2018-08-11
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多