地鼠新手在这里。请客气:-)
我有一个设置,在共享服务器上确实有一个帐户,该服务器运行我无法控制的Apache + FastCGI。不过,它可以与Go顺利交互。我更习惯将Go与net/http
一起使用,但是弄清楚如何与net/http/fcgi
一起使用似乎很简单。这是我的最小测试应用程序:
package main
import (
"fmt"
"net/http"
"net/http/fcgi"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-type", "text/plain; charset=utf-8")
fmt.Fprintln(w, "This was generated by Go running as a FastCGI app")
}
func main() {
/*
*
* Everything that is done here should be setup code etc. which is retained between calls
*
*/
http.HandleFunc("/", handler)
// This is what actually concurrently handles requests
if err := fcgi.Serve(nil, nil); err != nil {
panic(err)
}
}
现在,它可以完美无瑕地工作:将其编译为例如go-fcgi-test.fcgi
并将其放在适当的目录下之后,可以从类似http://my.shared.web.server/go-fcgi-test.fcgi
的URL运行Go代码。为了简单起见,我省去了大部分实际处理-但这与提取表单参数,ENV变量(在Go 1.9下!)等等非常完美,因此我知道基本设置必须可以。 >
让我们尝试一个稍微复杂的示例:
package main import ( "fmt" "net/http" "net/http/fcgi" ) func handler1(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-type", "text/plain; charset=utf-8") fmt.Fprintln(w, "This comes from handler1") } func handler2(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-type", "text/plain; charset=utf-8") fmt.Fprintln(w, "This comes from handler2") } func main() { http.HandleFunc("/first", handler1) http.HandleFunc("/", handler2) if err := fcgi.Serve(nil, nil); err != nil { panic(err) } }
现在,在这种情况下,我希望
http://my.shared.web.server/go-fcgi-test.fcgi
输出This comes from handler2
,的确是这样。
但是为什么http://my.shared.web.server/go-fcgi-test.fcgi/first
实际上也会调用handler2
,即handler1
被完全忽略?注意,handler2
does
/first
位— Apache正在not剥离它—因为我可以读取r.URL.Path[1:]
并确认这是发送到Go的完整路径。申请。我在Web上使用类似的FastCGI框架发现的所有示例仅显示one
处理程序。这是FastCGI包本身的限制吗? FastCGI协议的限制(但是,为什么正确发送了整个路径?)?在Apache配置上完成了一些操作,施加了此限制(请记住,我无法触摸Apache配置)?还是我做错了什么?((为了完整起见,我应该补充一点,我已经尝试了上述几种变体,重命名Go应用程序,使用子文件夹,使用several
处理程序,而不仅仅是一个处理程序,依此类推,等等。 )我的现实世界场景实际上是一个小型应用程序,在不支持独立模型的情况下,应该将其作为独立Web服务器使用net/http
或
fcgi.Serve()
,而不是http.ListenAndServe()
。但是,也可以在FastCGI下将net/http
程序包的路由功能与不同的处理程序一起使用。谢谢您的任何见解。即使答案是“是的,这也就是[精确地
FastCGI实现在Go下的工作方式-仅一个处理程序!”仍然有用-意味着我只需要处理自己的代码并做不同的事情(基本上,基于通过Form接口传递的参数创建自己的路由器/分派器-没关系,这是可行的!)地鼠新手在这里。请客气:-)我有一个设置,在共享服务器上确实有一个帐户,该帐户运行我无法控制的Apache + FastCGI。不过,它可以与Go顺利交互。我是...