Rails子域名开发环境如何配置reCAPTCHA及dotenv gem
reCAPTCHA本地子域环境配置方案
优先推荐:单组密钥适配所有本地子域
你不需要修改现有.env的单组密钥配置,直接在Google reCAPTCHA控制台将本地开发用的根域mydomain.lh加入允许域名列表即可。reCAPTCHA默认对已添加域名的所有下级子域生效,不会额外校验端口,你配置的blog.mydomain.lh:3000会直接通过校验,不会触发密钥不匹配错误。
保持.env原有配置即可:
RECAPTCHA_SITE_KEY=你申请的reCAPTCHA站点公钥 RECAPTCHA_SECRET_KEY=你申请的reCAPTCHA站点私钥
注意:不要将
localhost、127.0.0.1这类环回地址和自定义本地开发域名绑定到同一组reCAPTCHA密钥,部分场景下会触发跨域校验规则导致报错。
多组独立密钥的配置方法
如果你需要给不同子域配置完全独立的reCAPTCHA密钥(比如多站点并行开发),不需要拆分多个.env文件,直接在现有.env文件中用后缀区分不同子域对应的密钥即可:
# 主站对应密钥 RECAPTCHA_SITE_KEY_ROOT=主站公钥 RECAPTCHA_SECRET_KEY_ROOT=主站私钥 # blog子站对应密钥 RECAPTCHA_SITE_KEY_BLOG=blog子站公钥 RECAPTCHA_SECRET_KEY_BLOG=blog子站私钥
之后在项目reCAPTCHA初始化逻辑中,根据当前请求的host动态读取对应的环境变量即可,以Ruby on Rails的初始化配置为例:
# config/initializers/recaptcha.rb Recaptcha.configure do |config| current_host = Rails.application.routes.default_url_options[:host] || request.host if current_host == 'blog.mydomain.lh' config.site_key = ENV['RECAPTCHA_SITE_KEY_BLOG'] config.secret_key = ENV['RECAPTCHA_SECRET_KEY_BLOG'] else config.site_key = ENV['RECAPTCHA_SITE_KEY_ROOT'] config.secret_key = ENV['RECAPTCHA_SECRET_KEY_ROOT'] end end
其他Ruby框架逻辑一致:先获取当前访问的域名,再匹配对应环境变量传入reCAPTCHA初始化方法即可。
配置后仍报错的排查项
- 执行
ping blog.mydomain.lh确认hosts配置生效,解析结果指向127.0.0.1 - 检查reCAPTCHA控制台添加的域名是否为纯域名格式,不要带
http://协议头、不要带:3000端口号 - 修改
.env文件后必须重启本地开发服务,dotenv仅在服务启动时加载一次环境变量,运行中不会自动读取新配置 - 清空浏览器对应域名下的缓存、Cookie与本地存储,旧的reCAPTCHA校验缓存可能导致错误提示残留
内容的提问来源于stack exchange,提问作者Scott K
相关产品推荐
相关产品推荐

