Plesk环境下子域名反向代理保留原URL遇SSL代理错误如何解决
报错根因
日志记录的错误本质是:Apache执行反向代理请求到HTTPS类型的后端域名时,未启用SSL代理引擎。SSLProxyEngine属于服务器级配置项,无法在.htaccess文件中定义,因此哪怕.htaccess里写了[P]代理规则,也会因为权限不足直接抛出代理失败错误。
同时原有规则存在两个功能缺陷:
- 未透传路径中的id参数,固定写死目标路径为
/donations/,会丢失原始请求里的子路径参数 - 仅匹配了
/donations开头的请求,未覆盖/forms路径的代理需求
标准配置步骤
第一步:Plesk端前置配置(解决SSL代理报错)
登录Plesk后台进入clientname.domain.co.uk的站点管理页,打开Apache与Nginx设置面板,在“附加Apache指令”的输入框内添加以下配置(这段配置会被写入站点的虚拟主机配置块,不受.htaccess权限限制):
SSLProxyEngine On SSLProxyCheckPeerCN Off SSLProxyCheckPeerName Off
配置说明:
- 开启SSL代理引擎,解决日志提示的“SSL Proxy requested but not enabled”核心报错
- 关闭后端证书域名校验,避免因为两个子域名证书独立、校验不匹配导致的代理失败
第二步:替换.htaccess代理规则
在clientname.domain.co.uk站点根目录的.htaccess文件中,替换原有规则为以下内容:
RewriteEngine On Options +FollowSymLinks # 匹配/donations/任意子路径、/forms/任意子路径的请求 RewriteCond %{REQUEST_URI} ^/(donations|forms)/ # 透传完整路径(含id参数)到后端域名,不触发浏览器跳转 RewriteRule ^(donations|forms)/(.*)$ https://products.domain.co.uk/$1/$2 [P,QSA,L]
规则参数说明:
^(donations|forms)/(.*)$:同时覆盖两类代理路径,提取原始路径中的id等子路径信息$1/$2:将提取到的路径片段完整拼接到后端请求地址,保证后端能拿到正确的服务目录、识别路径中的id参数[P]:以反向代理方式转发请求,不会返回301/302跳转,完全保留浏览器地址栏的原始clientname.domain.co.uk域名QSA:自动透传URL中携带的查询参数L:匹配规则后立即终止后续规则执行,避免请求循环
常见问题排查
- 如果代理后出现静态资源加载失败,需确认后端
products.domain.co.uk页面内的资源路径使用相对路径,不要硬编码products.domain.co.uk的绝对地址 - 如果站点是Nginx前端+Apache后端的架构,需确认Nginx的代理请求体大小、超时时间匹配业务需求,避免大请求被截断
- 配置完成后可通过命令测试:
curl -I https://clientname.domain.co.uk/donations/123,返回内容为products站点的对应页面、浏览器地址栏未跳转,即说明配置生效
替代实现方案
如果不想手动修改虚拟主机配置、手写规则,可以直接用Plesk内置的反向代理功能实现相同效果:
- 进入
clientname.domain.co.uk的站点管理页,打开反向代理配置菜单 - 新增两条代理规则,分别匹配
/donations/*、/forms/*路径 - 规则目标设置为
https://products.domain.co.uk,开启“透传原始URI路径”、“保留客户端原始请求头”选项 - 保存配置后Plesk会自动生成完整的Apache/Nginx代理配置,包括自动开启SSLProxyEngine,无需手动处理权限和模块问题
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

