Cakephp中多主机的路由
正如食谱所说: 路由可以使用_host选项仅匹配特定主机。您可以使用*。匹配任何子域的通配符 但是,如果我想同时为多个主机设置相同的路由呢 例如: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',
$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');
另见