mirror of
https://github.com/Rayzggz/server_torii.git
synced 2025-06-23 07:21:32 +08:00
feat: custom error page
This commit is contained in:
71
config/error_page/403.html
Normal file
71
config/error_page/403.html
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 100vh;
|
||||||
|
margin: 0;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
text-align: left;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
.icon svg {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
stroke: #333;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: 100px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #e74c3c;
|
||||||
|
}
|
||||||
|
.message {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.description {
|
||||||
|
margin-top: 10px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.debug-info {
|
||||||
|
margin-top: 30px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
margin-top: 30px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.footer a {
|
||||||
|
color: red;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="error-code">403</div>
|
||||||
|
<div class="message">Access Denied (403 Forbidden)</div>
|
||||||
|
<div class="description">You do not have permission to access this resource.</div>
|
||||||
|
<div class="debug-info">Node: {{.EdgeTag}}<br>
|
||||||
|
Your IP: {{.ConnectIP}}<br>
|
||||||
|
Date: {{.Date}}<br>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
Security powered by <a href="https://github.com/Rayzggz/server_torii">⛩️Server Torii</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,5 +1,7 @@
|
|||||||
port: "25555"
|
port: "25555"
|
||||||
rule_path: "/www/dev/server_torii/config/rules"
|
rule_path: "/www/dev/server_torii/config/rules"
|
||||||
|
error_page: "/www/dev/server_torii/config/error_page"
|
||||||
|
node_name: "Server Torii"
|
||||||
connecting_ip_headers:
|
connecting_ip_headers:
|
||||||
- "X-Real-IP"
|
- "X-Real-IP"
|
||||||
connecting_uri_headers:
|
connecting_uri_headers:
|
||||||
|
@ -14,6 +14,8 @@ import (
|
|||||||
type MainConfig struct {
|
type MainConfig struct {
|
||||||
Port string `yaml:"port"`
|
Port string `yaml:"port"`
|
||||||
RulePath string `yaml:"rule_path"`
|
RulePath string `yaml:"rule_path"`
|
||||||
|
ErrorPage string `yaml:"error_page"`
|
||||||
|
NodeName string `yaml:"node_name"`
|
||||||
ConnectingIPHeaders []string `yaml:"connecting_ip_headers"`
|
ConnectingIPHeaders []string `yaml:"connecting_ip_headers"`
|
||||||
ConnectingURIHeaders []string `yaml:"connecting_uri_headers"`
|
ConnectingURIHeaders []string `yaml:"connecting_uri_headers"`
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"html/template"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -9,6 +10,7 @@ import (
|
|||||||
"server_torii/internal/config"
|
"server_torii/internal/config"
|
||||||
"server_torii/internal/dataType"
|
"server_torii/internal/dataType"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CheckFunc func(dataType.UserRequest, *config.RuleSet, *action.Decision)
|
type CheckFunc func(dataType.UserRequest, *config.RuleSet, *action.Decision)
|
||||||
@ -36,10 +38,30 @@ func StartServer(cfg *config.MainConfig, ruleSet *config.RuleSet) error {
|
|||||||
|
|
||||||
if decision.HTTPCode == "200" {
|
if decision.HTTPCode == "200" {
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
w.Write([]byte("Allowed"))
|
w.Write([]byte("OK"))
|
||||||
} else if decision.HTTPCode == "403" {
|
} else if decision.HTTPCode == "403" {
|
||||||
|
tpl, err := template.ParseFiles(cfg.ErrorPage + "/" + decision.HTTPCode + ".html")
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "500 - Internal Server Error", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data := struct {
|
||||||
|
EdgeTag string
|
||||||
|
ConnectIP string
|
||||||
|
Date string
|
||||||
|
}{
|
||||||
|
EdgeTag: cfg.NodeName,
|
||||||
|
ConnectIP: userRequestData.RemoteIP,
|
||||||
|
Date: time.Now().Format("2006-01-02 15:04:05"),
|
||||||
|
}
|
||||||
w.WriteHeader(http.StatusForbidden)
|
w.WriteHeader(http.StatusForbidden)
|
||||||
w.Write([]byte("Blocked"))
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
|
if err = tpl.Execute(w, data); err != nil {
|
||||||
|
http.Error(w, "500 - Internal Server Error", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// should not reach here
|
// should not reach here
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
Reference in New Issue
Block a user