如果您通过正则表达式对路由施加约束并将其设为可选,它应该可以工作。请参阅以下路线示例应该可以工作:
<?php
Route::get('/sitemap{suffix?}.xml', 'SitemapController@sitemap')
->where('suffix', '-?([0-9]+)?');
这是为什么?
Laravel 路由基于 Symfony 路由工作。路由中的可选部分不起作用,因为它是 Symfony 路由的工作方式。因此,如果可选部分之后有任何内容,则 Symfony 路由将不匹配,因为它将成为必需的。
您已定义如下路线
'/sitemap{suffix?}.xml'
注意.xml 在可选部分之后使用。所以这部分{suffix?} 现在是必需的。它必须有一些东西来代替suffix。这就是为什么sitemap.xml 不起作用但sitemap-01.xml 起作用的原因。
新手说明
Symfony 路由将为sitemap-09.xml 路径生成以下正则表达式:
"{^/sitemap(?P<suffix>[^/\.]++)\.xml$}sDu"
现在拿用括号包裹的部分称为命名捕获组.
(?P<suffix>[^/\.]++)
如果要检查命名捕获组的骨架,如下所示:
(?P<name>group)
这里团体该正则表达式的一部分表示匹配任何内容除了.xml 之前的正斜杠 (/) 和点 (.)。这意味着它匹配sitemap-0.xml 或将匹配任何代替-0 的sitemap-0.xml。
因此,当您从 sitemap-0.xml 中省略 -0 时,团体部分(因为它不是可选的)在.xml 之前没有任何匹配项。因此它与sitemap.xml 不匹配。
要解决此问题,您应该像我在上面所做的那样对路由进行约束,这会产生以下正则表达式:
"{^/sitemap(?P<suffix>-?(?:[0-9]+)?)\.xml$}sDu"
这里我告诉路由允许-和[0-9]可选.因此它匹配两者。