前置环境准备
首先确保服务器已安装Nginx 1.11.0及以上版本,如需使用动态令牌方案需安装OpenResty,对应安装命令如下:
- CentOS系统安装Nginx:
```
yum install -y nginx
验证版本
nginx -v
```
- Ubuntu系统安装Nginx:
```
apt update && apt install -y nginx
验证版本
nginx -v
```
若输出版本号低于1.11.0,需添加Nginx官方源重新安装即可。
方案一:固定令牌实现(小白首选,5分钟落地)
该方案使用固定字符串作为访问前缀,配置简单无需额外依赖,适合个人站点、小型项目使用。
步骤1:生成专属访问令牌
执行以下命令生成16位随机字符串作为专属访问前缀,不要泄露给无关人员:
```
openssl rand -hex 8
```
示例输出:a7d2f9c4e1b3058d,后续所有配置中该字符串需替换为你自己生成的内容。
步骤2:编写Nginx配置
编辑站点配置文件,路径一般为/etc/nginx/conf.d/你的站点域名.conf,完整可复制配置如下:
```
将以下map块放在nginx.conf的http块内,若直接写在站点配置文件则放在server块外
map $request_uri $admin_access {
default 0;
替换为你自己生成的令牌
~^/a7d2f9c4e1b3058d(/.)$ 1;
}
server {
listen 80;
server_name 你的站点域名;
root /usr/share/nginx/html;
index index.html index.htm;
禁止直接访问原后台路径,所有常见后台路径都可添加到此处拦截
location ^~ /admin {
deny all;
return 404;
}
location ^~ /manage {
deny all;
return 404;
}
location ^~ /system {
deny all;
return 404;
}
令牌路径转发规则
location ^~ /a7d2f9c4e1b3058d {
去掉令牌前缀后转发给后台服务
rewrite ^/a7d2f9c4e1b3058d(/.)$ $1 break;
替换为你实际的后台服务地址
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
其他站点原有配置保持不变
location / {
try_files $uri $uri/ =404;
}
}
```
步骤3:验证配置生效

执行以下命令验证配置正确性,无误后重载Nginx:
```
nginx -t
systemctl reload nginx
```
测试:直接访问https://你的域名/admin会返回404,访问https://你的域名/你的令牌/admin即可正常进入后台。
方案二:动态时间令牌实现(高安全需求首选)
该方案令牌每10分钟自动刷新,即使泄露也不会长期有效,适合企业站点、多人协作的后台使用,需安装OpenResty,安装命令如下:
```
yum install -y yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install -y openresty
```
步骤1:配置动态令牌生成与校验规则
编辑OpenResty配置文件,路径为/usr/local/openresty/nginx/conf/nginx.conf,完整配置如下:
```
http {
include mime.types;
default_type application/octet-stream;
lua_shared_dict token_cache 1m;
server {
listen 80;
server_name 你的站点域名;
禁止直接访问原后台路径
location ^~ /admin {
deny all;
return 404;
}
令牌生成接口
location /generate_admin_token {
content_by_lua_block {
-- 替换为你自己的自定义秘钥,不要泄露
local secret = "my_custom_secret_20240601@$"
local time = ngx.time()
-- 10分钟为一个时间槽,令牌有效期10-20分钟
local current_time_slot = math.floor(time / 600)
local token = ngx.md5(secret .. current_time_slot)
ngx.say("当前有效后台路径: /" .. token)
}
}
动态令牌校验与转发
location ~ ^/([0-9a-f]{32}) {
set $token $1;
rewrite_by_lua_block {
-- 和上面的秘钥保持一致
local secret = "my_custom_secret_20240601@$"
local time = ngx.time()
local current_slot = math.floor(time / 600)
local valid_token1 = ngx.md5(secret .. current_slot)
-- 保留上一个时间槽的令牌,避免切换时访问失败
local valid_token2 = ngx.md5(secret .. (current_slot - 1))
if ngx.var.token ~= valid_token1 and ngx.var.token ~= valid_token2 then
ngx.exit(404)
end
}
去掉令牌前缀后转发给后台
rewrite ^/[0-9a-f]{32}(/.)$ $1 break;
替换为你实际的后台服务地址
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
其他站点原有配置保持不变
location / {
root html;
index index.html index.htm;
}
}
}
```
步骤2:添加令牌生成接口认证
为避免无关人员获取有效令牌,给生成接口加基础认证,执行以下命令生成账号密码:
```
yum install -y httpd-tools
htpasswd -c /usr/local/openresty/nginx/conf/.htpasswd admin
```
按提示输入密码后,在generate_admin_token的location块中添加以下两行配置:
```
auth_basic "Admin Token Generate";
auth_basic_user_file conf/.htpasswd;
```
步骤3:验证生效
重载OpenResty后,访问https://你的域名/generate_admin_token,输入刚才设置的账号密码即可获取当前10分钟内有效的后台路径,访问该路径即可进入后台,10分钟后路径自动失效。
```
systemctl reload openresty
```
常见问题排查
- 访问令牌路径返回404:首先执行
nginx -t检查配置是否正确,查看/var/log/nginx/error.log日志,确认proxy_pass指向的后台服务是否正常运行,rewrite规则是否匹配路径。
- 后台静态资源加载失败:检查后台代码是否使用了绝对路径,建议统一设置后台上下文路径,比如SpringBoot项目在application.yml中添加
server.servlet.context-path=/admin,PHP项目将后台文件统一放在admin目录下。
- 动态令牌切换时访问失败:配置中已默认保留上一个时间槽的令牌有效期10分钟,若仍出现问题可调整时间槽长度,将
math.floor(time / 600)中的600改为1200,延长有效期至20分钟。