Total Pageviews

Saturday, 3 January 2015

WordPress 中的 .htaccess 的坑

WordPress 中的 .htaccess 莫名其妙的被还原了,导致站点不能强制使用 https 了。
今天准备做一次站点的本地备份,就把主机上的备份拉了下来。在比对文件的时候,发现备份下来的 .htaccess 文件和本地已有的文件不一样,上次写入强制使用 https 的规则莫名奇妙的消失了。不过让我更疑惑的是:站点现在还是强制使用 https 访问的,可是在浏览器的隐私模式下却没有强制使用 https 访问。原因是浏览器的缓存没有清除,当然这是后面才发现的。

装完 WordPress 并在后台设置伪静态的“固定链接”后,WordPress 会自动生成一个包含如下内容的 .htaccess 文件:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
强制使用 https 的规则被我放在了 RewriteEngine On 语句的下面,今天发现自己写的规则不见了。在网上找到了一个原因:只要你点击了 WordPress 后台“设置”中的“固定链接”,不管你是否做了修改,只要点击了“固定链接”,.htaccess 中 # BEGIN WordPress# END WordPress 之间的内容就会被 WordPress 复写。自己亲自测试过了,这个问题确实存在。
当然 WordPress 只会复写 # BEGIN WordPress# END WordPress 之间的内容,因此这个问题最好的解决方案是:把自己将要添加的 .htaccess 规则,写在 # BEGIN WordPress# END WordPress 之外就可以了,比如写入强制使用 https 的规则如下:
# BEGIN SSL
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !^on$ [NC]
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</IfModule>
# END SSL

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
在向客服咨询的时候,技术人员有提到一点:WordPress 更新也会导致这个问题。恰巧在今天 WordPress 自动更新了一次,而自己又点过后台的“固定链接”,因此我不能确定技术人员描述的问题是否属实。除此之外,还要考虑将自己写入的注释说明弄得特殊一点,其 中 # BEGIN SSL# END SSL 就是注释说明,以免遇到某个插件会在你的注释说明之间写入规则,进而导致你自己的规则无故消失.