我想路由具有以下模式的网址;
http://mywebsite.com/en/url.html
以下代码有效。
Router::prefix ( 'en', function ($routes) {
$routes->extensions ( [
'html'
] );
$routes->connect ( '/:page', [
'controller' => 'Pages',
'action' => 'view',
]
, [
'pass' => [
'page'
]
] );
$routes->fallbacks ( 'InflectedRoute' );
} );
对于没有html扩展名的控制器,会出现问题。例如
http://mywebsite.com/en/controller/
有没有办法限制
$routes->connect ( '/:page', [
'controller' => 'Pages',
'action' => 'view',
]
以.html扩展名结尾的网页?
答案 0 :(得分:1)
据我记得,这不可能开箱即用,你需要额外的逻辑来处理这种或那种。
我说你最好的选择是custom route class,它不仅可以限制匹配的传入网址(Route::parse()
),还可以反向路由(Route::match()
)。< / p>
您可以根据RouteBuilder::extensions()
定义的扩展名测试URL(数组)的扩展名,以便需要其中一个可解析的扩展名,这是一个非常基本的示例:
<强>的src /路由/路由/ MyCustomRoute.php 强>
namespace App\Routing\Route;
use Cake\Routing\Route\Route;
class MyCustomRoute extends Route {
public function parse($url) {
list(, $ext) = $this->_parseExtension($url);
if(!in_array($ext, $this->extensions())) {
return false;
}
return parent::parse($url);
}
public function match(array $url, array $context = []) {
if(!isset($url['_ext']) || !in_array($url['_ext'], $this->extensions())) {
return false;
}
return parent::match($url, $context);
}
}
<强>配置/ routes.php文件强>
// ...
$routes->connect('/:page', [
'controller' => 'Pages',
'action' => 'view',
], [
'routeClass' => '\App\Routing\Route\MyCustomRoute',
'pass' => ['page']
]);
// ...
这将导致只有具有扩展名的URL可解析,并且只提供具有扩展名的URL数组,即
/en/page.html
['controller' => 'Pages', 'action' => 'view', '_ext' => 'html']
会有效,而
/en/page
/en/page.xml
['controller' => 'Pages', 'action' => 'view']
['controller' => 'Pages', 'action' => 'view', '_ext' => 'xml']
不会。
有关详细信息,请参阅
答案 1 :(得分:0)
不确定为什么它会像那样,但我设法通过将正则表达式条件设置为:page来限制您的.html文件路径。
Router::prefix ( 'en', function ($routes) {
$routes->extensions ( [
'html'
] );
$routes->connect ( '/:page', [
'controller' => 'Pages',
'action' => 'view',
]
, [
'page' => '[0-9a-z]+',
'pass' => [
'page'
]
] );
$routes->fallbacks ( 'InflectedRoute' );
} );