CORS 的 preflight 机制

昨天帮某客户配置 wordpress 的 SSL,本以为是个很简单的活儿,结果遭遇问题,弄了很久才解决。在此过程中对跨域访问的预检机制有了较多的了解,在此记录。

需求:
之所以要将该 wordpress 网站升级为整站 https,除了网站本身的安全性和对外形象之外,最主要是该网站的文章是另外一个 web 应用的数据来源。具体来说,是客户另外那个 web 应用通过 rest api 获取该网站的文章列表并显示。而 web 应用已经率先整站 https,若其通过基于未加密的 http 协议来访问该 wordpress 网站的 rest api,浏览器中会有安全提醒。

第一步:
客户 wordpress 网站基于 centos7,apache2.4.6,php7.0 等。帮客户升级至 php7.4,安装 certbot 配置 let‘s encrypt 证书并配置自动续期,配置安全规则允许 443 端口访问。https 成功可以访问,初步成功。

问题1:
虽然网站在浏览器中可以使用 https 进行访问,但客户的 web 应用上对该网站的 rest api 请求却失败。仔细查看浏览器控制台输出,发现报的错误是:Cross origin resource sharing error: MissingAllowOriginHeader。含义是在 rest api 的 HTTP 响应头中,没有包含 Access-Control-Allow-Origin 的 header。

解决1:
WordPress 虽然是全球用量很大的 CMS 系统,但其文档及社区却不敢恭维,主要是因为其版本众多,各种网络文章针对不同版本不容易分辨,且 PHP 这门世界上最好的语言实在太容易各种 hack,所以对于一个问题的解决方案也是八仙过海,各显神通,良莠不齐。了解到 wordpress 默认不允许跨域访问。经过试验各种配置(包括调整 apache 的默认配置和 VirtualHost 配置,调整 wordpress 的.htaccess 文件内的配置),最后使用的方案是在 wordpress 的 wp-include 文件夹下修改 function.php 实现跨域访问的域名白名单。

问题2:
前一步成功以后,查看浏览器中该 api 访问的预检仍然报错:Cross origin resource sharing error: HeaderDisallowedbyPreflightresponse。这是提示请求头中有不允许的 header,通过排查,发现是请求方应用中有某几个自定义的请求头,通过在服务器端设置 Access-Control-Allow-Headers 而成功。

解决WordPress站点的固定链接不工作的问题

出于对站点SEO的考虑,决定将之前默认的固定链接形式由?p=n 改为%postname%。

结果在wordpress里面改完设置后,访问链接的时候发生404错误。

网上有说法是.htaccess文件的权限问题,建议删除后再设置固定链接一次,以便重新生成.htaccess文件。我试了没用。

后来发现是mod_rewrite的权限问题。需要在httpd.conf中,将Directory的AllowOverride 由None改为All。改完后一切OK。

详情可参阅这篇文章

升级了服务器

这两天用晚上时间,将 Ubuntu 升到了 8.04,WordPress 也升级到了2.6。

前者很顺利,后者则碰到了 K2 RC2 Theme与新版本WordPress不兼容的问题。解决办法很简单,将 K2 文件夹暂时改名,则 WordPress 因找不到该文件夹而恢复到默认主题。

下载了K2 RC6,发现问题集中在其自有的Sidebar机制和WordpPess的Widget机制,两种中的任一种都工作不正常。无奈先换回default theme。

看来K2的开发进度有点拖后。不知K2是会继续坚持使用自己的 Sidebar 机制呢,还是转向 WordPress 的 Widget 机制呢?拭目以待。

OpenSource与我的服务器

这些年,因为工作需要,基本都在Microsoft环境下工作,很少接触Linux或者其他开源的东西。10月18号看到Ubuntu 7.10发布的消息,第二天就烧录了一张Live CD看看情况。结果一发不可收拾,发现Linux的桌面已经做得非常好用了。记得2001年在马同学的学校宿舍里,曾经买过RedHat,结果死活装不起来。现在的进步真是天壤之别。

于是就想多玩玩,决定搭建一个网站。环顾四周,家里闲置了三年的台式机,被我请出来了。赛扬766,内存256,40G硬盘。这就是写这篇文章时运行此网站的服务器配置。LAMP是什么? Linux+Apache+MySQL+PHP而已。貌似这是Linux环境下搭建网站的经典组合。我一向不勤快,直接就下载了WordPress装上了。这年头,用得着重新发明轮子么?

关于这里提到的一些开源的东西,也许我得空会另开文章去评价。