GoAhead3 - 路由处理

一. 前言

        GoAhead包含一个强大的请求路由引擎,管理客户端HTTP请求的处理方式。路由是由一个名为route.txt的配置文件中的一组路由配置而成。这个文件在GoAhead启动时被加载。当收到一个请求时,路由引擎会测试各个路由,并选择最佳路由来处理该请求。在这个过程中,路由可以根据需要重定向或重写请求。

        一个GoAhead配置通常会有很多条路由,通过将路由URI模式与请求的URL相匹配,对配置的路由依次进行测试。一个路由可能需要满足更多的前提条件才适合处理请求。如果所需条件没有得到满足,配置文件的下一条路由将被测试。总是有一个"万能的路由",如果所有先前的路由都不符合条件,它将处理该请求。

二. 路由配置

1. 路由配置文件

        路由规则由route.txt配置文件定义。配置文件中有一系列的路由执行规则。路由配置样式如下

route uri=/cgi-bin dir=cgi-bin handler=cgi
route uri=/action handler=action
route uri=/ extensions=jst,asp handler=jst
route uri=/ methods=OPTIONS|TRACE handler=options

         文件的每行定义一条新的路由规则,虽然路由规则有很多可选的参数,但是每条路由规则都必须要有一个uri关键字,它定义了一个URI前缀 (合格的请求都需要有)。如果客户端请求的URI不符合路由URI的前缀,那么该条路由规则将被跳过,继续匹配下一条。

2. 路由配置顺序

        当配置文件中有多条路由规则,路由匹配的顺序是按照路由规则在配置文件中定义的先后决定的,因此顺序非常的重要。对于具有相似前导字符的路由,具有更长URI的路由应该定义在更前面。

三. 路由配置关键字

        路由规则是由一系列键值对( keyword=value )组成,所有路由规则都必须要有uri关键字,其他的关键字是可选的,下面是所有支持的路由关键字,如下:

1. abilities

        abilities关键字指定了当访问该路由所描述的资源时,用户所需要的能力,能力不满足,则不能访问该路由指定的资源。多个abilities以逗号分隔。当多个abilities被指定时,指定的所有abilities都需要满足。例如:

route uri=/auth/basic/ auth=basic abilities=create,edit,view

        激活用户的abilities,是通过auth.txt文件的关键字指定使能认证和授权。举例如下:

role name=manager abilities=view,edit,delete
user name=joshua password=2fd6e47ff9bb70c0465fd2f5c8e5305e roles=manager

2. auth

        auth关键字指定了要使用的认证方案。认证是一个要求用户提供用户名和密码的过程,然后验证凭证的有效性,最后确定应该授权该用户哪些abilities。支持的认证方案有:basic(Basic authentication),digest(Digest authentication),form(web-form based authentication)。

        如果用户的凭证不能被认证,用户将被重定向一个新的由redirect关键字指定的URI,当认证失败时,GoAhead回复一个HTTP 401状态码,意味着不能被授权访问,举例如下:

route uri=/ auth=form handler=continue redirect=401@/pub/login.html

3. dir

        dir关键字定义了这个路由的包含文档的文件系统目录,这会覆盖默认的文档路径。如果客户端请求一个具体的文档时,请求的URI的路径会被附加到这个目录中用来定位要提供的文件。

4. extensions

        extensions关键字指定了由该路由提供的文档的扩展名,例如:

route uri=/ extension=cgi|fcgi|mycgi handler=cgi

5. handler

        handler关键字指定了负责生成响应的GoAhead处理程序。如果没有指定,默认为文件处理程序。有效的handler包括:actioncgifilejstoptionsredirectupload

6. methods

        一条路由规则可以定义一组可接受的HTTP方法,多个方法应该通过"|"符号分隔开,例如:

route uri=/put/ methods=PUT|DELETE

        标准的HTTP方法有:DELETEGETOPTIONSPOSTPUTTRACE

7. protocol

        一条路由可以通过protocol关键字,将协议限制在一个指定的协议,例如HTTP或HTTPS。案例如下:

route uri=/ protocol=https

8. redirect

        redirect关键字指定目标URI,客户端将根据响应的HTTP的状态码被重定向到这些URI。

格式为:

        redirect=STATUS@URI

STATUS是HTTP状态码,并且URI需要是一个有效的目标URI,例如:

route uri=/old-content/ redirect=404@/upgrade-message.html

        不像其他关键字,一条路由规则中只能有一个,redirect关键字可以有多个。

9. uri

        uri关键字是所有路由的必选项,它定义了匹配请求的URI资源。所有以指定uri值开始的请求URI都将会被匹配。一个好的做法是在最后加上一个/来匹配目录。

10. 关键字分隔符

        有些关键字可以包含多个值(abilities,extensions,methods),在这些情况下,值是通过使用"|"或","符号分隔开。当所有的值都需要满足的情况,使用",",当只需要指定的值的一个满足就可以时,使用"|"。具体来说,abilities应该使用","分隔,extensions和methods应该用"|"分隔。

四. 路由处理

        为了处理一个请求,GoAhead路由引擎检查每一个配置的路由,以确定请求的最佳的匹配路由。它通过按照配置文件中定义的顺序检查每条路由来做到这一点。每条路由都需要经过一系列步骤的测试。如果一个路由在某个步骤中不能匹配,该路由将被丢弃,并继续匹配下一条路由。     

路由匹配顺序

1. Protocol

2. Method

3. Extension

4. URI

五. 总结

        本文主要介绍GoAhead的路由的工作机制,介绍了路由规则的配置文件的格式以及GoAhead路由引擎如何利用该文件,还介绍了一系列的路由规则的关键字及作用。最后介绍了路由匹配关键字的顺序。

实际使用中的案例:

1.  重定向请求

route uri=/oldfile.html redirect=/newfile.html

2. 重定向HTTP到HTTPS

route uri=/ protocol=http redirect=https

3. 通过摘要认证方式访问

route uri=/ auth=digest

4. 使能TRACE和OPTIONS方法

route uri=/partition/ methods=OPTIONS|TRACE handler=options

5. 定义新的文件扩展名和handler关键字

route uri=/ extensions=jst,asp handler=jst

6. 万能路由规则

route uri=/
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中处理Access-Control-Allow-Origin,通常是为了解决跨域资源共享(CORS)的问题。CORS是一种浏览器安全机制,用于限制跨域请求。当浏览器发起跨域请求时,服务器需要在响应头中添加Access-Control-Allow-Origin字段来指定允许访问的源。 在Go中,你可以使用中间件或者自定义处理函数来处理CORS。下面是一个示例代码: ```go package main import ( "net/http" ) func main() { // 创建一个处理函数 handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 设置允许访问的源 w.Header().Set("Access-Control-Allow-Origin", "*") // 处理其他逻辑 // ... }) // 使用中间件处理CORS corsHandler := corsMiddleware(handler) // 启动HTTP服务器 http.ListenAndServe(":8080", corsHandler) } // 中间件函数,用于处理CORS func corsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 检查请求方法是否为OPTIONS if r.Method == "OPTIONS" { // 设置允许的请求方法和头部字段 w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE") w.Header().Set("Access-Control-Allow-Headers", "Content-Type") w.WriteHeader(http.StatusNoContent) return } // 调用下一个处理函数 next.ServeHTTP(w, r) }) } ``` 在上述示例中,我们创建了一个处理函数`handler`,并使用`corsMiddleware`中间件来处理CORS。`corsMiddleware`函数会检查请求方法是否为OPTIONS,如果是,则设置允许的请求方法和头部字段,并返回204 No Content响应。如果不是OPTIONS请求,则调用下一个处理函数,并在响应头中设置Access-Control-Allow-Origin字段为"*",表示允许所有源进行访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值