diff --git a/pkg/core/domain.go b/pkg/core/domain.go index 26b970a..454137e 100644 --- a/pkg/core/domain.go +++ b/pkg/core/domain.go @@ -77,9 +77,6 @@ func (p *PageDomain) ReturnMeta(owner string, repo string, branch string, path [ rel.Owner = owner rel.Repo = repo rel.Path = strings.Join(path, "/") - if strings.HasSuffix(rel.Path, "/") || rel.Path == "" { - rel.Path = rel.Path + "index.html" - } if err = p.alias.Bind(meta.Alias, rel.Owner, rel.Repo, branch); err != nil { zap.L().Warn("别名绑定失败", zap.Error(err)) return nil, err diff --git a/pkg/server.go b/pkg/server.go index 41481c1..193e799 100644 --- a/pkg/server.go +++ b/pkg/server.go @@ -144,6 +144,11 @@ func (s *Server) Serve(writer http.ResponseWriter, request *http.Request) error } } } + // 在非反向代理时处理目录访问 + if strings.HasSuffix(meta.Path, "/") || meta.Path == "" { + meta.Path = meta.Path + "index.html" + } + // 如果不是反向代理路由则跳过任何配置 if request.Method != "GET" { return os.ErrNotExist diff --git a/tests/core/vhserver.go b/tests/core/vhserver.go index 1efc852..1aa1521 100644 --- a/tests/core/vhserver.go +++ b/tests/core/vhserver.go @@ -23,6 +23,7 @@ func NewServer() *VServer { mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { zap.L().Debug("ServeHTTP", zap.String("url", r.URL.String())) + http.Error(w, "", http.StatusNotFound) }) go func() { _ = http.Serve(listener, mux) diff --git a/tests/pages_core_test.go b/tests/pages_core_test.go index ceff608..07aab3c 100644 --- a/tests/pages_core_test.go +++ b/tests/pages_core_test.go @@ -33,7 +33,7 @@ alias: data, resp, err = server.OpenFile("https://org1.example.com/repo1/") assert.Equal(t, resp.StatusCode, 302) - assert.Equal(t, resp.Header.Get("Location"), "https://www.example.org/index.html") + assert.Equal(t, resp.Header.Get("Location"), "https://www.example.org/") data, resp, err = server.OpenFile("https://www.example.org") assert.NoError(t, err) assert.Equal(t, "hello world", string(data)) @@ -44,14 +44,18 @@ alias: `) data, resp, err = server.OpenFile("https://www.example.org") assert.Equal(t, resp.StatusCode, 302) - assert.Equal(t, resp.Header.Get("Location"), "https://zzz.example.top/index.html") + assert.Equal(t, resp.Header.Get("Location"), "https://zzz.example.top/") data, resp, err = server.OpenFile("https://www.example.org") assert.Equal(t, resp.StatusCode, 404) data, resp, err = server.OpenFile("https://org1.example.com/repo1/") assert.Equal(t, resp.StatusCode, 302) - assert.Equal(t, resp.Header.Get("Location"), "https://zzz.example.top/index.html") + assert.Equal(t, resp.Header.Get("Location"), "https://zzz.example.top/") + + data, resp, err = server.OpenFile("https://org1.example.com/repo1/get/some") + assert.Equal(t, resp.StatusCode, 302) + assert.Equal(t, resp.Header.Get("Location"), "https://zzz.example.top/get/some") } func Test_fail_back(t *testing.T) { diff --git a/tests/pages_proxy_test.go b/tests/pages_proxy_test.go index 3f2dd00..dd05f79 100644 --- a/tests/pages_proxy_test.go +++ b/tests/pages_proxy_test.go @@ -12,13 +12,15 @@ func Test_proxy(t *testing.T) { hs := core.NewServer() defer server.Close() defer hs.Close() + hs.Add("/test/data", "hello data") hs.Add("/test/", "hello proxy") server.AddFile("org1/repo1/gh-pages/index.html", "hello world") server.AddFile("org1/repo1/gh-pages/.pages.yaml", ` proxy: /api: %s/test -`, hs.URL) + /abi: %s/ +`, hs.URL, hs.URL) data, _, err := server.OpenFile("https://org1.example.com/repo1/") assert.NoError(t, err) assert.Equal(t, "hello world", string(data)) @@ -26,4 +28,40 @@ proxy: data, _, err = server.OpenFile("https://org1.example.com/repo1/api") assert.NoError(t, err) assert.Equal(t, "hello proxy", string(data)) + data, _, err = server.OpenFile("https://org1.example.com/repo1/api/data") + assert.NoError(t, err) + assert.Equal(t, "hello data", string(data)) + + _, resp, err := server.OpenFile("https://org1.example.com/repo1/abi/data") + assert.Equal(t, resp.StatusCode, 404) +} + +func Test_cname_proxy(t *testing.T) { + server := core.NewDefaultTestServer() + hs := core.NewServer() + defer server.Close() + defer hs.Close() + hs.Add("/test/", "hello proxy") + + server.AddFile("org1/repo1/gh-pages/index.html", "hello world") + server.AddFile("org1/repo1/gh-pages/.pages.yaml", ` +alias: + - www.example.org +proxy: + /api: %s/test +`, hs.URL) + _, resp, err := server.OpenFile("https://org1.example.com/repo1/") + assert.Equal(t, resp.StatusCode, 302) + assert.Equal(t, resp.Header.Get("Location"), "https://www.example.org/") + data, resp, err := server.OpenFile("https://www.example.org") + assert.NoError(t, err) + assert.Equal(t, "hello world", string(data)) + + _, resp, err = server.OpenFile("https://org1.example.com/repo1/api") + assert.Equal(t, resp.StatusCode, 302) + assert.Equal(t, resp.Header.Get("Location"), "https://www.example.org/api") + + data, resp, err = server.OpenFile("https://www.example.org/api") + assert.NoError(t, err) + assert.Equal(t, "hello proxy", string(data)) }