https下cookie必须同时启用httponly和secure,且nginx反代时需透传x-forwarded-proto并手动设$_server['https']='on';url生成须配置url_domain和url_scheme为https;微信js-sdk签名url须与绑定域名完全一致。

HTTPS下Cookie的HttpOnly和Secure必须同时启用
ThinkPHP5默认不强制开启secure标志,但只要走HTTPS,所有敏感Cookie(如session_id、token)就必须带secure + httponly。否则浏览器会拒绝发送,导致登录态丢失或反复跳转。
配置位置在application/config.php的cookie数组里:
'cookie' => [
'httponly' => true,
'secure' => true, // 这行不能漏,且仅HTTPS有效
'samesite' => 'Lax',
],
注意:如果项目前端通过Nginx反向代理HTTPS,而PHP实际跑在HTTP后端(比如http://127.0.0.1:8080),则TP5无法自动识别HTTPS环境——此时必须手动告诉框架当前是安全连接:
- 在
public/index.php最开头加:$_SERVER['HTTPS'] = 'on'; - 或在Nginx配置中透传头:
proxy_set_header X-Forwarded-Proto $scheme;,并在TP5中启用app.url_domain配合url生成逻辑
域名绑定时URL生成与重定向必须用全量HTTPS地址
TP5的url()函数、redirect()、模板中的{:url()}默认不带协议和域名,只输出路径。在HTTPS域名绑定场景下,这会导致跳转回HTTP或相对路径,触发混合内容警告甚至被浏览器拦截。
解决方法是统一配置url_domain和url_scheme:
// application/config.php 'url_domain' => 'https://api.yourdomain.com', 'url_scheme' => 'https',
这样url('index/index')才会生成https://api.yourdomain.com/index/index。若用子域名(如admin.yourdomain.com)单独绑定后台,需在对应模块的配置中覆盖该值,避免跨域跳转。
容易踩的坑:
- 没配
url_domain,但用了redirect()->to('https://...')硬编码——后期换域名要全局搜改,不可维护 - 配了
url_domain却忘了改url_scheme,结果生成http://...链接 - 小程序调用TP5接口时,后端返回的跳转地址含
http://,微信直接拒绝加载
Nginx反代HTTPS时必须透传Host和X-Forwarded-*头
很多部署失败的根源不在TP5代码,而在Nginx没把客户端真实信息传过去。典型表现:登录后跳回http://localhost、Request::domain()返回localhost、微信JS-SDK签名失败。
关键Nginx配置段(location块内):
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host;
其中X-Forwarded-Proto决定TP5是否认为当前请求是HTTPS;Host决定Request::domain()和路由匹配的依据。漏掉任一字段,都可能导致域名绑定失效或安全策略误判。
验证方式:在控制器里打印input()和Request::header(),确认https和host值是否符合预期。
微信小程序JS-SDK签名域名必须与HTTPS绑定域名完全一致
小程序调用wx.config需要后端生成签名,而签名算法依赖jsapi_ticket + 当前页面URL。如果TP5生成的location.href或接口返回的url字段是http://或不含子域名,签名必然失败,控制台报invalid signature。
实操要点:
- 确保小程序后台「公众号JS接口安全域名」和「业务域名」都填了你实际绑定的HTTPS域名(如
https://m.yourdomain.com) - TP5接口返回给前端的
signature、nonceStr、timestamp、url四字段中,url必须是当前页面完整HTTPS地址(不含#hash),且不能带端口 - 如果用
url('api/sign')生成签名用的URL,务必提前配好url_domain,否则生成的是相对路径
最易忽略的一点:微信校验url时会严格比对协议、域名、路径,连末尾斜杠差异都会导致签名不匹配。调试时建议用console.log(location.href)把真实URL发给后端参与签名计算,而不是靠TP5拼接。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











