我想阻止从列出的其他域访问我的某些应用程序路由,但未列出。使用以下代码成功:
$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
答案 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');
详情:
\b
:我们得到的正是字符串。\.
:在正则表达式中,字符 .
表示任何字符。因此,我们必须使用反斜杠转义 .
。注意:
您可能会收到错误消息,因为我无法检查结果。让我知道您遇到的任何错误。
答案 3 :(得分:0)
我想阻止从其他域访问我的某些应用程序路由 除了列出。使用以下代码成功:
我认为您对针对此问题的更好、更基于 Laravel 核心的解决方案的想法是正确的。
您在控制器文件中定义的每个路由处理方法都会收到一个请求。在标准 Laravel 中,这是一个 Illuminate\Http\Request
类型的对象。
您可以使用自定义类扩展此类 - 比如说“AdminRequest”。这个扩展类提供了授权方法,用于检查 Auth:user 是否具有正确的角色、会话值或您想要的应用程序中的任何内容。
我想这更灵活和干净 - 在您的控制器中,您只需更改您在该控制器方法中收到的请求的定义。验证消息和其他所有内容都可以包装在自定义请求类中。
另见:
答案 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);
所以只有一个回家路线。