Cakephp中多主机的路由

Cakephp中多主机的路由,cakephp,url-routing,cakephp-4.x,Cakephp,Url Routing,Cakephp 4.x,正如食谱所说: 路由可以使用_host选项仅匹配特定主机。您可以使用*。匹配任何子域的通配符 但是,如果我想同时为多个主机设置相同的路由呢 例如: $routes->connect( '/images', ['controller' => 'Images', 'action' => 'index'] )->setHost('images.example.com'); $routes->connect( '/images',

正如食谱所说:

路由可以使用_host选项仅匹配特定主机。您可以使用*。匹配任何子域的通配符

但是,如果我想同时为多个主机设置相同的路由呢

例如:

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHost('images.example.com');

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHost('images.example2.com');

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHost('images.example3.com');
如果我必须设置几十条这样的路线,上面的内容是毫无意义的

理想情况是这样的:

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHosts(['images.example.com','images.example2.com','images.example3.com']);

这是不受支持的,您必须相应地设置多个路由,您只需在循环中输入主机列表即可:

foreach(['images.example.com'、'images.example2.com'、'images.example3.com']作为$host){
$routes
->连接(
“/图像”,
['controller'=>'图像','action'=>'索引']
)
->setHost($host);
}
或者创建一个自定义路由类,该类可以接受多个主机,也可以接受实际的正则表达式。后者可能更容易,因为它不需要重新实现大量匹配内容,例如:

src/Routing/Route/RegexHostRoute.php

namespace-App\Routing\Route;
使用Cake\Routing\Route\DashedRoute;
类RegexHostRoute扩展了DashedRoute
{
公共函数匹配(数组$url,数组$context=[]):?字符串
{
//避免尝试在parent::match()中将_host选项与其自身进行匹配
如果(!isset($url[''u host'])){
返回null;
}
返回父::匹配($url,$context);
}
公共函数hostMatches(字符串$host):bool
{
返回preg_match('^@'.$this->options[''u host'].@$',$host)==1;
}
}
这应该允许设置像
images\这样的主机。示例[2-3]?\.com

$routes
->连接(
“/图像”,
['controller'=>'图像','action'=>'索引'],
['routeClass'=>\App\Routing\Route\RegexHostRoute::class]
)
->setHost('images\.example[2-3]?\.com');
另见


这是不受支持的,您必须相应地设置多个路由,您只需在循环中输入主机列表即可:

foreach(['images.example.com'、'images.example2.com'、'images.example3.com']作为$host){
$routes
->连接(
“/图像”,
['controller'=>'图像','action'=>'索引']
)
->setHost($host);
}
或者创建一个自定义路由类,该类可以接受多个主机,也可以接受实际的正则表达式。后者可能更容易,因为它不需要重新实现大量匹配内容,例如:

src/Routing/Route/RegexHostRoute.php

namespace-App\Routing\Route;
使用Cake\Routing\Route\DashedRoute;
类RegexHostRoute扩展了DashedRoute
{
公共函数匹配(数组$url,数组$context=[]):?字符串
{
//避免尝试在parent::match()中将_host选项与其自身进行匹配
如果(!isset($url[''u host'])){
返回null;
}
返回父::匹配($url,$context);
}
公共函数hostMatches(字符串$host):bool
{
返回preg_match('^@'.$this->options[''u host'].@$',$host)==1;
}
}
这应该允许设置像
images\这样的主机。示例[2-3]?\.com

$routes
->连接(
“/图像”,
['controller'=>'图像','action'=>'索引'],
['routeClass'=>\App\Routing\Route\RegexHostRoute::class]
)
->setHost('images\.example[2-3]?\.com');
另见