【发布时间】:2012-06-28 20:25:48
【问题描述】:
鉴于此路径:/page(/:pageID),我如何允许以下变体:
-
/page和/page/(即使缺少 pageID 部分。 -
/page/1和/page/1/
谢谢。
【问题讨论】:
-
PHP语言和你的问题有什么关系?你当前的 PHP 代码是什么?
-
Slim 是一个 PHP 框架。
鉴于此路径:/page(/:pageID),我如何允许以下变体:
/page 和 /page/(即使缺少 pageID 部分。/page/1 和 /page/1/
谢谢。
【问题讨论】:
你必须这样定义你的路线:
$app->get('/page(/:id/?)', function ($id = NULL) use ($app) {
; // your code
});
【讨论】:
@inst 提供的答案在这里不起作用(在 XAMPP 上运行的 Slim 2.0.0):/page/ 给出 404。
这适用于所有四种情况:
$app->get('/page(/)(:id/?)', function ($id = NULL) use ($app) {
echo 'success';
});
【讨论】:
('/page(/)(:id/?)' 部分。问候
如documentation 中所述,可选段可能会根据使用情况而不稳定。比如Fabien Snauwaert给出的答案,以及以下路线:
/:controller(/)(:action(/)(:overflow+/?)) /:controller(/)(:action(/:overflow+/?))
如果未填写所有参数,则在获取参数值时,这些值将位于右侧,从而产生action == controller和overflow == action。
为了防止这种情况,一个简单的解决方案是将可选的斜杠放在路由的末尾。
/:controller(/:action(/:overflow+))/? /:controller(/:action(/:overflow+))(/)
而且它更具可读性,不是吗?
我无法评论其他人的答案,所以我在这里写下有关 Igor 回复的详细信息。
这种方法的一个“问题”是,如果用户尝试访问一个不存在的页面,并且还使用尾部斜杠,则会进行 301 重定向以显示 404 页面。可能有点奇怪。
【讨论】:
我发现这种方法可以在启用 Apache mod_rewrite 的情况下实现这一目标。 .htaccess的片段
RewriteEngine On
# remove trailing slash
RewriteCond %{HTTPS} off
RewriteRule ^(.+[^/])/$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} on
RewriteRule ^(.+[^/])/$ https://%{HTTP_HOST}/$1 [R=301,L]
【讨论】:
Slim V3 的示例:
/[{param1:[0-9]+}[/[{param2:[0-9]+}[/]]]]
这将包括:
/
/1
/1/
/1/2
/1/2/
【讨论】: