htpasswd -bc /etc/nginx/conf.d/auth.passwd clicksun clicksun
server {
listen 80;
server_name your_domain.com;
location / {
auth_basic "请输入验证码";
auth_basic_user_file /etc/nginx/conf.d/auth.passwd;
# 原有的反向代理配置
proxy_pass http://your_internal_website;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sudo nginx -t
sudo systemctl restart nginx
访问网站时,浏览器会弹出对话框要求输入用户名和密码,输入"clicksun"作为用户名和密码即可3910。
方法二:使用Nginx的if指令实现自定义验证码检查
如果你想在网页表单中实现验证码输入(而非浏览器弹窗),可以使用以下配置:
修改Nginx配置:
server {
listen 80;
server_name your_domain.com;
# 验证码检查
set $auth_code "";
if ($arg_code = "clicksun") {
set $auth_code "passed";
}
location / {
# 如果没有验证码或验证码错误
if ($auth_code != "passed") {
return 401 "请输入验证码: <form method='get'><input type='text' name='code'><input type='submit' value='提交'></form>";
}
# 原有的反向代理配置
proxy_pass http://your_internal_website;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这样访问时需要在URL中添加验证码参数,如:http://your_domain.com?code=clicksun4。
方法三:使用Nginx的auth_request模块(更灵活)
如果需要更复杂的验证逻辑,可以使用auth_request模块:
确保Nginx编译时包含--with-http_auth_request_module模块
创建验证脚本(如PHP/Python),检查请求中的验证码
配置Nginx:
server {
listen 80;
server_name your_domain.com;
location /auth {
internal;
proxy_pass http://127.0.0.1:8080/verify; # 你的验证服务
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
location / {
auth_request /auth;
error_page 401 = @error401;
# 原有的反向代理配置
proxy_pass http://your_internal_website;
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 @error401 {
return 200 "请输入验证码: <form method='post' action='/verify'><input type='text' name='code'><input type='submit' value='提交'></form>";
}
}
这种方法需要额外的验证服务,但灵活性最高67。
注意事项
方法一最简单但安全性较低(密码以Base64形式传输,建议配合HTTPS使用)910
固定验证码安全性不高,建议定期更换或实现动态验证码2
如果使用HTTPS,记得配置SSL证书18
测试配置时先用nginx -t检查语法,确认无误后再重启39
以上方法中,方法一实现最简单且能满足你的需求(固定验证码"clicksun")。如需更高级的安全控制,可以考虑结合IP限制或其他认证方式23。
这个验证码的有效期是多久?之后访问网站的每个页面都要提供吗?我希望是一次性的验证,之后此电脑访问此网站就不需要再验证了,可以吗?
根据你的需求(一次性验证后不再需要重复验证),以下是几种实现方案及验证码有效期相关问题的解答:
一、验证方案选择与有效期控制
基于Cookie/Session的验证(推荐方案)
- 实现原理:用户首次输入验证码(如"clicksun")后,服务端生成一个持久化的Cookie或Session标记,浏览器后续请求自动携带该标记跳过验证1。
- 有效期控制:
- Cookie:可设置过期时间(如30天),期间无需重复验证1。
- Session:默认随浏览器关闭失效,也可配置服务器端延长有效期。
- Nginx配置示例(需配合Lua或第三方模块):
location /verify {
# 验证验证码逻辑,通过后设置Cookie
add_header Set-Cookie "auth_pass=1; Path=/; Max-Age=2592000"; # 30天有效期
return 302 /;
}
location / {
# 检查Cookie是否存在
if ($cookie_auth_pass != "1") {
return 302 /verify_page;
}
proxy_pass http://your_internal_website;
}
IP白名单方案
- 一次性验证后:将客户端IP加入Nginx的白名单列表,后续直接放行2。
- 局限性:动态IP用户可能失效,需定期维护白名单。
浏览器本地存储方案
- 通过JavaScript在本地存储验证状态(如localStorage),但安全性较低,不建议单独使用。
二、验证码的触发频率
- 首次验证后:通过上述Cookie/Session或IP白名单机制,同一设备访问所有页面均无需重复验证12。
- 例外情况:
- 用户清除了浏览器Cookie或更换设备。
- IP白名单方案中客户端IP发生变化。
三、安全性增强建议
- 组合验证:Cookie验证 + IP绑定(双重校验防冒用)2。
- 动态令牌:若需更高安全,可替换固定验证码为一次性令牌(如邮件链接验证)1。
四、实现步骤(以Cookie方案为例)
- 创建验证页面(如
/verify_page)包含表单提交验证码。 - 配置Nginx处理验证逻辑并设置Cookie。
- 测试流程:
- 首次访问 → 跳转至验证页面 → 输入"clicksun" → 设置Cookie → 后续访问直接通行。
通过以上方案,可实现"一次性验证,长期有效"的需求。若需更详细的配置代码或安全性调整建议,可进一步说明具体环境要求。