nginx下反向代码 apache 下的 wordpress启用证书后的数据流大致以下:php
因为wordpress在接收到请求后会进行:当前请求信息是否与数据库中设置的当前网站地址相一致。从而致使在进行数据转发时因为在nginx层面发生了https与http的转换,进而致使了301的问题。对应上面的数据流,对应的流程以下:css
若是把wordpress中的网站地址变动为:http://www.codedemo.club,则因为在判断协议的时候http与http相同,则不会发生301的错误。但因为wordpress内部发送静态资源地址时,地址上加入了网站前缀,好比发送的CSS地址为:http://www.codedemo.club/sytle.css
,而非/sytle.css
。这将触发一个浏览器的一个保护机制 ---- 浏览器阻止:在一个https的页面上调用http请求。nginx
吐个槽:话说学校某教学相关的系统正是因为在https页面上加载了http插件,从而致使一些EXCEL的导出没法正常工做了。
结合上文描述以及在因为定制端口致使的301重定向问题
一文中的分析,得出如下结论:若要避免wordpress的301问题,则必须保证转发给wordpress的域是相同的。数据库
又因为域相同的三要素是:协议、域名、端口号。因此最终的结论是:若要避免wordpress的301问题,则必须保证转发给wordpress的协议、域名、端口号都是相同的。apache
在apache中启用https,nginx在进行转发时将数据按apache的证书进行加密后,传给apache服务:segmentfault
以上便保证了访问wordpress时协议也是https的。浏览器
这个方案最大的问题在于须要分别对nginx、apache配置证书。nginx在进行数据转发时,进行了数据的解密与加密,apache又从新对数据进行了一次解密。从效率上来说确定是最低的,固然也是最不值得推荐的方案。wordpress
另外一种方案是在nginx将当前协议经过header转发。wordpress判断转发的header信息中协议是否为https。若是为https则重置系统变量,从而让wordpress误认为当前的http请求为https请求:
修正文件为:wp-config.php网站
define( 'WP_DEBUG', false ); + if ( $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) + { + $_SERVER['HTTPS'] = 'on'; + $_SERVER['SERVER_PORT'] = 443; + }
本方案须要对wordpress源码进行修改,虽然解决了问题,但仍有待完善。加密