2017-06-11 16:23:00 +08:00
|
|
|
|
// Copyright 2017 fatedier, fatedier@gmail.com
|
|
|
|
|
//
|
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
|
|
package vhost
|
|
|
|
|
|
|
|
|
|
import (
|
2019-04-25 12:29:34 +08:00
|
|
|
|
"bytes"
|
2021-09-29 10:33:57 +08:00
|
|
|
|
"io"
|
2017-06-11 16:23:00 +08:00
|
|
|
|
"net/http"
|
2021-09-29 10:33:57 +08:00
|
|
|
|
"os"
|
2017-06-11 16:23:00 +08:00
|
|
|
|
|
2024-03-12 13:58:53 +08:00
|
|
|
|
"github.com/fatedier/frp/pkg/util/log"
|
2020-09-23 13:49:14 +08:00
|
|
|
|
"github.com/fatedier/frp/pkg/util/version"
|
2017-06-11 16:23:00 +08:00
|
|
|
|
)
|
|
|
|
|
|
2022-08-29 01:02:53 +08:00
|
|
|
|
var NotFoundPagePath = ""
|
2019-04-25 12:29:34 +08:00
|
|
|
|
|
2017-06-11 16:23:00 +08:00
|
|
|
|
const (
|
|
|
|
|
NotFound = `<!DOCTYPE html>
|
|
|
|
|
<html>
|
2024-10-05 10:25:11 +08:00
|
|
|
|
<head>
|
|
|
|
|
<title>503 Service Unavailable - 服务不可用</title>
|
|
|
|
|
<link rel="shortcut icon" href="data:image/x-icon;base64,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
|
|
|
|
|
<style>
|
|
|
|
|
body {
|
|
|
|
|
background-image: url("https://api.rcov.top/api/v1/acg?source=fj&json=false");
|
|
|
|
|
background-attachment: fixed;
|
|
|
|
|
background-size: cover;
|
|
|
|
|
}
|
|
|
|
|
.box {
|
|
|
|
|
color: white;
|
|
|
|
|
width: 35em;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
font-family: Tahoma, Verdana, Arial, sans-serif;
|
|
|
|
|
padding: 8px 32px;
|
|
|
|
|
box-shadow: 0px 0px 16px rgba(0,0,0,0.1);
|
|
|
|
|
margin-top: 80px;
|
|
|
|
|
font-weight: 300;
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
background-color: rgba(0,0,0,0.5);
|
|
|
|
|
}
|
|
|
|
|
.box h1 {
|
|
|
|
|
font-weight: 300;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<div class="box">
|
|
|
|
|
<h1>HayFrp Server ERROR<br>503 Service Unavailable - 服务不可用</h1>
|
|
|
|
|
<p>您访问的网站或服务暂时不可用</p>
|
|
|
|
|
<p>如果您是隧道所有者,造成无法访问的原因可能有:</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>您访问的网站使用了内网穿透,但是对应的客户端没有运行。</li>
|
|
|
|
|
<li>该网站或隧道已被管理员临时或永久禁止连接。</li>
|
|
|
|
|
<li>域名解析更改还未生效或解析错误,请检查设置是否正确。</li>
|
|
|
|
|
<li>仍无法解决请尝试参考<a style="color: white;" href="https://learn.hayfrp.org">官方帮助文档</a>或访问知识库</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>如果您是普通访问者,您可以:</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>稍等一段时间后再次尝试访问此站点。</li>
|
|
|
|
|
<li>尝试与该网站的所有者取得联系。</li>
|
|
|
|
|
<li>刷新您的 DNS 缓存或在其他网络环境访问。</li>
|
|
|
|
|
<li>如果成功与网站所有者取得联系您可以尝试更改hosts以访问</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p align="right"><em>Powered by <a style="color: white;" href="https://www.hayfrp.org">HayFrp</a> | Based on HayFrp Server</em></p>
|
|
|
|
|
</div>
|
|
|
|
|
</body>
|
2017-06-11 16:23:00 +08:00
|
|
|
|
</html>
|
|
|
|
|
`
|
|
|
|
|
)
|
|
|
|
|
|
2019-04-25 12:29:34 +08:00
|
|
|
|
func getNotFoundPageContent() []byte {
|
|
|
|
|
var (
|
|
|
|
|
buf []byte
|
|
|
|
|
err error
|
|
|
|
|
)
|
|
|
|
|
if NotFoundPagePath != "" {
|
2021-09-29 10:33:57 +08:00
|
|
|
|
buf, err = os.ReadFile(NotFoundPagePath)
|
2019-04-25 12:29:34 +08:00
|
|
|
|
if err != nil {
|
2024-03-12 13:58:53 +08:00
|
|
|
|
log.Warnf("read custom 404 page error: %v", err)
|
2019-04-25 12:29:34 +08:00
|
|
|
|
buf = []byte(NotFound)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
buf = []byte(NotFound)
|
|
|
|
|
}
|
|
|
|
|
return buf
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-18 14:28:05 +08:00
|
|
|
|
func NotFoundResponse() *http.Response {
|
2017-06-11 16:23:00 +08:00
|
|
|
|
header := make(http.Header)
|
2024-10-05 10:25:11 +08:00
|
|
|
|
header.Set("server", "hayfrp/"+version.Full())
|
2017-06-26 22:24:47 +08:00
|
|
|
|
header.Set("Content-Type", "text/html")
|
2019-04-25 12:29:34 +08:00
|
|
|
|
|
2022-10-09 12:13:27 +08:00
|
|
|
|
content := getNotFoundPageContent()
|
2017-06-11 16:23:00 +08:00
|
|
|
|
res := &http.Response{
|
2022-10-09 12:13:27 +08:00
|
|
|
|
Status: "Not Found",
|
|
|
|
|
StatusCode: 404,
|
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
|
ProtoMajor: 1,
|
|
|
|
|
ProtoMinor: 1,
|
|
|
|
|
Header: header,
|
|
|
|
|
Body: io.NopCloser(bytes.NewReader(content)),
|
|
|
|
|
ContentLength: int64(len(content)),
|
2017-06-11 16:23:00 +08:00
|
|
|
|
}
|
|
|
|
|
return res
|
|
|
|
|
}
|