frp/pkg/util/vhost/resource.go

118 lines
18 KiB
Go
Raw Normal View History

// 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"
"io"
"net/http"
"os"
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"
)
2022-08-29 01:02:53 +08:00
var NotFoundPagePath = ""
2019-04-25 12:29:34 +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,AAABAAEAAAAAAAEAIADYKgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAKp9JREFUeNrtnVlwXFd633/n3l7Q3QCIheAGkuK+U6JE7dJoG89oFo+tsSeTsV0pJy5XuVKxU8nEqbzkKS9+SMoPiZM8OInz4HJsz+axx/bMWJslzUijkbhK3ElwBUASO9B733PycLqBXm5vJEiAuN+v6hJgd99z723c73++833fOVexBBhj6r3lFrdQ8Wcc6AZ6gM7i/0uvJYCO4hYGHEAVN0G4V5iynx6QB7JAGpgDZoEkkCr+Pl3cssXPF4qb9jwP13UrGlfq/t6+ofv6zdU3fAVEgH5gsLitATYVtx6swceKW2fx/9HiFmJBAAThfmAAjRWAHJDBGv4c1vjTxf+PA1eBEeAmcL34+6TWOue6rgH45je/yR/+4R/O28j9EoL7ZjA+xq+wRtyLNfZBYAuwtfhzXfG1ARaESlXtvyTXIghFTJ3/l7+eAW4Bo8AwcBm4UtyuA7eBCaxoVHA/ROCeHqFOjx/Guu3dWGPfDxwqboNYUQhjjb60iXELDyqaStc/hzX2K8BR4DhwEisMKaxgFKobuVdicE9ardPbg3XzNwMHsAb/SPH//UAf1r13WzqIIDy4eNjhwQQwBlzEisAxrCCMFj9Ta0iLLASLLgB1ev1OY8ygUmo3C4a/G3gIO54XhKCigSngGnAa6xWcAM5hhwyZ6h0WUwQWVQCqjF9hA3SrgV3AE8ALWJd/NQtuvrOY5yAIDxilYKKHzRTcxgrAPwIfAkPAZPG9eQNbLBFYlFZ8en0X685vBT4HvATsw7r6pTG+IAiVGGxWIYnNGHwKvAW8jY0ZpLBiASyOCNx1GrBk/FprjDG4rhvCBvMOG2NeUEo9gfUA+pFgniA0opQOj2CD5KUM2RasCBzFphANsCgpw7sSgPKe33EcjDGdwDZjzLNKqVeVUs9gc/jS4wtCezjYFHg/sA3YUPz9A2xdwXxswBhzxyJwR3v5uPwO1uU/CLwGvALsxAb43Ds9jiAIgB0WTANngNeB72EzB2nKhgTQvjewGJWArjFmlVLqeeBLwHNYl0Wi+4KwOISxafKHgS6sZ/DXwMfYDIJ3pw23LQBVvX8I2KCUeg74CvAstoIvstTfmCCsMBTW+PdgxSCBjRO8jw0YFqD94UDLAuCT4gsDG4EXgd/Euv9dSOWeINwLSjYVBtYDX8V6AhHgJ9jgYA7aCw7e6RAgjK3g+2XgV7Epvk5kQo4g3Guc4tYNPIOdHdtpjHlTKXUZnzLiRrQkAD5u/yBWgV7DVvV1IAU9gnA/UdihwONAodjb/z22jDgPrQ0HmgpAlfE72DH+i8DXsMYfRnp9QVgqElhPIIudivwWNiagobkINBQAn3F/FzbQ98+xwYgIYvyCsJQ4WBF4Dptyn8LWCkziM5nIb+dWiWN7/q9iA36diPELwnJAYasGDwO/ATxKWSauwUI89T2Aqp06sTnIXwKex3oCYvyCsLzoAz6LjQNMYycVzWcG/IYCrQQBQ8B2bMDvGWxtsqT6BGH54WA9gVexE4puATcoFgr5iUDNEMAYU977O9ic45PYGX0PIUE/QViuONjOeQvwGazNrm22QyMi2HHFl7C1/QnE+AVhOVOal7MH+HLxZ5w6dlshAFXj/ih2Pv9L2IU8upb6ygRBaAmFrRJ8Ghuz20Zxqb0qD79hDGDAGPNlpdTTWOOXQh9BeDBQWIMfwHoBpaXJZ6o/WM+oO4AtSqkXsa6/TOkVhAePCHYI8ATWjmOlN0pegFP9AtbQB7GBvz3YqKIYvyA8eJSKhPZja3j6/T5QPfaPYHP+X8Km/ORxW4LwYKKwNr4LuzbnZqpW56oeAoSwab8D2GW740t9BYIg3BUKW8i3FVshOEhZx+9U9f4dLKzb38t9fnagIAj3BAfr/r+A7did8jfK6Qaewtb6y6o+grBy6MYGA/dQVs9TLgAxrHuwF7vSjzyiSxBWDmHsA3n2GGN2Yet8KgSgH+v6b8KO/SXvLwgrh9KTuvYqpQ5TjO85ZW+ux1YOrVnqMxUE4Z7gYusBHsMOCeYFwMU+eOAw1k0QBGHlUXrYyFbsyl5xh4WSwYewvb8E/wRhZVJazXsAmw3oLwnAIFYVZHFPQVj5dGOzAQOl+cMbsXOI5Rl+grDy6cIu8tNfEoB12BiACIAgrHw6sVOE1zhYt38QKwBS+ScIK58INg4w6GDdgUFs9F+KfwRh5VNaNWidg11JtB9Z6FMQgkQI6HWw44HEUp+NIAj3FRfoc7AlgR1LfTaCINxXXIpZgAQNVg0VBGFF4lIcAnQhj/kShKDhUCwF7kRW/hGEoKGAaCkdIDEAQQgWCgg72DnCMgFIEILFvACEkApAQQgiroMNBsiDPwQhWCjAcZB1/wUhqKiSAAiCEEBKi3+Yu2pFEIQHEln9RxACjAiAIAQYEQBBCDAiAIIQYEQABCHAiAAIQoARARCEACMCIAgBRgRAEAKMCIAgBBgRAEEIMCIAghBgRAAEIcCIAAhCgBEBEIQAIwIgCAFGBEAQAowIgCAEGBEAQQgwIgCCEGBEAAQhwIgACEKAEQEQhAAjAiAIAUYEQBACjAiAIAQYEQBBCDAiAIIQYEQABCHAiAAIQoARARCEACMCIAgBRgRAEAKMCIAgBBgRAEEIMCIAghBgRAAEIcCIAAhCgBEBEIQAIwIgCAFGBEAQAowIgCAEGBEAQQgwIgCCEGBEAAQhwIgACEKAEQEQhAAjAiAIAUYEQBACjAiAIAQYEQBBCDAiAIIQYEQABCHAiAAIQoARARCEACMCIAgBJrTUJyAsH/J5gzagSi8Uf3EUhELqTpsVljEPhACYXAGdyda+oRROLIoKua23VfDQ6SwYc9dtVbaZAeP/vopGcKLh5u3kC/bc/NoIh3Bi0bbOKzubRRcMRgEoDGBQKAWxzjCOu2DUI6N5/uh/3mQ6qXGjChVxcMIKFVZ8/vkuXn2ms/GxPEPOA6UoU5A7J6QUHT5/ipyGnDYtt+MocFCEHLgbDdMG0p6h1SM7SuEqe0x3GWvnAyEAE3/9DtNvfIRyFkYsxkBoVZx1v/d1IhtWt9zWzNtHGP/u2yi18FcxgNsVZ/3v/RMigwPtnZwxTHzvbabfOlLR5sLbht6vPE/vF59p2lTqk4vc+pO/BU9XtqE18cf2sva3voxyWxu13Twxylt/8C6zsx55N0JWhcg7YdImxO7nNvDV391D1F2wsFOfpnj9jWkKjsKNOThRB6fDobMnxNe/0NPwWHkP/uzTLGdmPEJRByeqUCFlhaB1W634ezzf7/Lq2srbUxv4wWiBI1Nea2NXZYUk4kDChd6ww2BMsS2hWN/hEGljAHxmTvPt6wUKpvkFqeJxow50hhQDUcXGmOKhuMNARBFeRgPvZS8A3lyKmXePk7lwHcpvfk+TOLyHUG9Xy22ZfIGZ906QOX+ttq3HdrfVVonUJ5cY/+7bFCZmit1fFdrgTc621JYKh8ldu4mXys73ogrQnkat6sYUCig30rSd9FiS9//LO1z96TVybpSMEyHrREgTpm9nP099cZBoWfdqDBw/niRfMITjDo6rrHegYNfmCHu3NvY8bqU0Px/JM+4ZQh3g5BVOO9ZVRdiB/kjtdzmVN3w06XEtbdoIXpmyfzWugq6QYneXwysDLnu6nKYOiwFOTGvOJ/UdHVdhvYBVYcXOToeXBlz2tnDc+8GyF4Ds0Ai5azdRoVCla6kUnYf3tOUW54bHyJy/Zt38cmNVisRju3HiHW2dmzebYuzP/4HCxCzKrTd0MNYPbYFQXzdudwKdyVWcnzKgM1lM3oMml6sLmuP/62dcf28IJxRBOQqnePzu1R386r87yNb9PRX7zEwX+PSTZM0N6Tjw5MEY3Z2Nb/uzYwUm0xo36liXW7V8ybXnb2Bdh2JbovaYl1OasZy5K1ceYKZg+NmEx/k5zTc2hni6r/Gwb65gODdnjf9Or8sAk3nDBxMeZ2Y1XxsM8ZnV
<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>
</html>
`
)
2019-04-25 12:29:34 +08:00
func getNotFoundPageContent() []byte {
var (
buf []byte
err error
)
if NotFoundPagePath != "" {
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
}
func NotFoundResponse() *http.Response {
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()
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)),
}
return res
}