Laravel获取多域路由中的当前域

时间:2019-03-27 09:13:55

标签: php laravel laravel-5

我想阻止从列出的其他域访问我的某些应用程序路由,但未列出。使用以下代码成功:

$loginRoutes = function() {
Route::get('/', 'HomeController@index')->name('home');
};

Route::domain('domain1.com')->group($loginRoutes);
Route::domain('domain2.com')->group($loginRoutes);
Route::domain('localhost')->group($loginRoutes);

但是问题是当我调用{{route('home')}}时,URL始终成为routes.php的最后一行的域(上面的情况是http://localhost)。如何使其成为当前域?

我在php 7.3.3中使用laravel 5.7

5 个答案:

答案 0 :(得分:0)

您也许可以尝试这样的事情:

Route::pattern('domainPattern', '(domain1.com|domain2.com|localhost)');
$loginRoutes = function() {
    Route::get('/', 'HomeController@index')->name('home');
};
Route::group(['domain' => '{domainPattern}'], $loginRoutes);

答案 1 :(得分:0)

我也在使用PHP 7.3和Laravel 5.7 我实际上在我的域中使用此路由。 也许这与您要求的不完全相同,但是您可以尝试这样的操作

// To get the routes from other domains
// Always add the new domains here
$loginRoutes = function() {
    Route::get('/', 'HomeController@index')->name('home');
};

Route::group(array('domain' => 'domain1.com'), $loginRoutes);
Route::group(array('domain' => 'domain2.com'), $loginRoutes);
Route::group(array('domain' => 'domain3.com'), $loginRoutes);

如果要在域级别处理某些事情。在您的控制器(HomeController @ index)中,您可以获取当前域并执行所需的任何操作。为了获得确切的域,我使用了这样的方法:

class HomeController extends Controller
{ 
   public function index()
   {
      $domain = parse_url(request()->root())['host'];
      if ($domain == 'domain1.com'){
         // do something
      }
      ...
   }
   ...
}

这样,我可以为每个域处理不同的事情。

为了使其更加完整,我们可以从表/查询中获取域并动态创建路由。

$domains = Cache::get('partners')->where('status', '=', 'A')->where('domain', '<>', '')->all(); 
$loginRoutes = function() {
    Route::get('/', 'HomeController@ index')->name('home');
};
foreach ($domains as $domain) {
    Route::group(array('domain' => $domain->dominio_externo), $loginRoutes);
}

它一直在为我工作。希望对您有所帮助。

答案 2 :(得分:0)

如果我理解您的问题,您只想过滤域。使用 regex,你可以做到。你可以试试下面的代码:

Route::domain('{domain}')->group($loginRoutes)->where('domain', '\b(domain1\.com|domain2\.com|localhost)\b');

详情:

  1. \b:我们得到的正是字符串。
  2. \.:在正则表达式中,字符 . 表示任何字符。因此,我们必须使用反斜杠转义 .

注意:
您可能会收到错误消息,因为我无法检查结果。让我知道您遇到的任何错误。

答案 3 :(得分:0)

<块引用>

我想阻止从其他域访问我的某些应用程序路由 除了列出。使用以下代码成功:

我认为您对针对此问题的更好、更基于 Laravel 核心的解决方案的想法是正确的。

您在控制器文件中定义的每个路由处理方法都会收到一个请求。在标准 Laravel 中,这是一个 Illuminate\Http\Request 类型的对象。

您可以使用自定义类扩展此类 - 比如说“AdminRequest”。这个扩展类提供了授权方法,用于检查 Auth:user 是否具有正确的角色、会话值或您想要的应用程序中的任何内容。

我想这更灵活和干净 - 在您的控制器中,您只需更改您在该控制器方法中收到的请求的定义。验证消息和其他所有内容都可以包装在自定义请求类中。

另见:

How to Use custom request (make:request)? (laravel) Method App\Http\Requests\Custom::doesExistI does not exist

Extend Request class in Laravel 5

答案 4 :(得分:0)

为了防止访问某个路由,将路由注入到这些结构中是一种糟糕的设计:

Route::domain('domain1.com')->group($loginRoutes);
Route::domain('domain2.com')->group($loginRoutes);
Route::domain('localhost')->group($loginRoutes);

因为它定义了多次路由,只有最后一个是 override 其他的。

您可以通过 php artisan route:list 查看。

laravel 处理这种情况的方法(访问管理)是使用中间件

class DomainValid
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $domain = $request->server->get('SERVER_NAME');
        if (in_array($domain , ['domain1.com','domain2.com','localhost'] )) {
            return $next($request);
        }
        abort(403);
    }
}

并像这样使用它:

use App\Http\Middleware\DomainValid;

Route::get('/', 'HomeController@index')->name('home')->middleware(DomainValid::class);    

所以只有一个回家路线。

相关问题