rsthn / rose-ext-router
路由扩展(Rose)
Requires
README
此扩展向 Rose 添加内容路由功能。
composer require rsthn/rose-ext-router
安装后,确保通过编辑 system.conf 文件的 Gateway 部分,将 Router 设置为系统中的主服务,并将 service=router。另外,除非您想使用 index.php/my-route/,否则我们建议您启用 URL 重写以创建美观的 URL。如果使用 Apache 或兼容服务器,可以使用以下 .htaccess:
RewriteEngine On
RewriteBase /my-project/
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
默认操作
Router 将使用 Gateway 提供的相对路径(例如,当使用 index.php/home 类似的东西时,相对路径是 /home)并使用以下规则(按优先级顺序,满足条件者先)返回适当的内容。
-
用户已认证1且存在
rcore/content/home/private.html文件时,将加载该文件,使用Expr进行评估并发送给客户端。 -
用户未认证且存在
rcore/content/home/public.html文件时,将加载该文件,使用Expr进行评估并发送给客户端。 -
当存在
rcore/content/home/index.html文件时,将加载该文件,使用Expr进行评估并发送给客户端。 -
用户未认证且仅存在
rcore/content/home/private.html时,Router 将重定向到/login。 -
Router 将重定向到
/404。
1“已认证用户”条件通过检查当前会话(如果有)的 user 字段是否设置为非空值(由 Sentinel 设置)来确定。
路由到服务或 URL
当某个路由(例如 /api)应将控制权传递给另一个 Rose 服务(例如 wind)或重定向到 URL 时,您可以使用 system.conf 文件的 Router 部分来实现此目的,通过提供 "route=service_name" 对(其中 route 是无分隔符的正则表达式),例如:
[Router] /api = service:wind /details/([0-9]+) = service:wind/?f=get-details&id=(1) /external-page = location:https://example.com/contact-us/ /([0-9]+)/home = home/(1)
服务重定向
-
在值中使用
service:前缀将导致内部重定向到指定的服务。- 例如,
/api = service:wind将重定向到服务wind。
- 例如,
-
值中提供的任何路径都将设置为新的相对路径。
- 例如,
/api = service:wind/details将重定向到服务wind,并将相对路径设置为/details。
- 例如,
-
客户端在路由基本路径之后提供的任何路径都将附加到相对路径。
- 例如,
/api = service:wind/details但由客户端作为/api/users加载时,将导致重定向到服务wind,相对路径为/details/users。
- 例如,
-
值中提供的任何查询参数将合并到当前请求参数中。
- 例如,
/api = service:wind/details?b=B并由客户端作为/api/users?a=A加载时,将导致重定向到服务wind,相对路径为/details/users,请求参数为a=A&b=B。
- 例如,
位置重定向
-
在值中使用
location:前缀将导致在响应 HTTP 头部中设置location头,并立即终止执行。- 例如,
/contact = location:https://example.com/将重定向到 URLhttps://example.com/。
- 例如,
-
客户端在路由基本路径之后提供的任何路径都将被忽略。
- 例如
/contact = location:https://example.com/和从客户端加载为/contact/sub-path/将重定向到https://example.com/。
- 例如
-
客户端指定的任何查询参数将被忽略。
- 例如
/contact = location:https://example.com/?a=A和从客户端加载为/contact/sub-path/?b=B将重定向到https://example.com/?a=A。
- 例如
注意
路由的值使用 Expr 来评估,因此如果需要,可以进行格式化,并且可以通过 (gateway.request.<name>) 的方式通常访问网关请求参数映射中的变量。