AWS Elastic Beanstalk中WordPress固定链接无法持久化问题求助
我处理过好多个用户碰到这个情况——按AWS官方教程部署WordPress后,固定链接一开始设置完能用,但实例重启或者环境扩容后就又返回404,得去后台重新保存一遍固定链接配置才恢复。其实核心原因很简单:
WordPress生成的.htaccess文件在Elastic Beanstalk的实例里不是持久化的,而且EB默认的Apache配置没放开让.htaccess生效的权限。每次实例重启,EB都会从基础镜像重新初始化,之前生成的.htaccess会被清空,自然规则就失效了。
下面是几个彻底解决的方案,按推荐程度排序:
方案1:用EB配置文件永久开启Apache重写权限
这个方法既能保留WordPress后台修改固定链接的灵活性,又能让配置在实例重启后不丢失,是最推荐的做法:
- 在你本地的WordPress项目根目录,创建一个名为
.ebextensions的文件夹(注意开头的点,别漏了) - 进入这个文件夹,新建一个
wordpress-rewrite.config文件,把下面的内容复制进去:
files: "/etc/httpd/conf.d/wordpress-override.conf": mode: "000644" owner: root group: root content: | <Directory "/var/app/current"> AllowOverride All Require all granted </Directory> commands: 01_enable_rewrite_module: command: "sudo a2enmod rewrite" ignoreErrors: true
- 把整个WordPress项目(包括新建的
.ebextensions文件夹)重新打包,上传到Elastic Beanstalk部署
原理说明:
- 我们创建了一个Apache的配置文件,强制让WordPress所在的
/var/app/current目录允许.htaccess覆盖规则(默认EB的Apache是AllowOverride None,所以.htaccess里的规则根本不生效) a2enmod rewrite命令确保Apache的重写模块是启用的,ignoreErrors是为了避免模块已经启用时命令报错- 每次实例启动,EB都会自动加载这个配置文件,所以不管怎么重启,权限和模块都保持生效状态
方案2:直接把重写规则写入Apache全局配置
如果你不想依赖.htaccess,可以直接把WordPress固定链接的重写规则写到Apache的全局配置里,这样彻底绕过.htaccess的问题:
同样在.ebextensions文件夹里创建wp-permalinks.config文件,内容如下:
files: "/etc/httpd/conf.d/wp-permalinks.conf": mode: "000644" owner: root group: root content: | <Directory "/var/app/current"> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </Directory> commands: 01_enable_rewrite_module: command: "sudo a2enmod rewrite" ignoreErrors: true
部署后,不管你用哪种固定链接结构,这些规则都能直接生效,不需要WordPress生成.htaccess。缺点是如果以后要修改固定链接结构,你得手动更新这个配置文件。
针对Amazon Linux 2环境的注意事项
如果你用的是Amazon Linux 2版本的Elastic Beanstalk环境(现在EB默认是这个),Apache的重写模块默认已经启用了,所以可以把commands部分删掉,简化配置文件。另外,确保你的配置文件路径是正确的,上面的配置在AL2环境下同样适用。
额外小技巧
在wp-config.php里添加下面几行,可以帮WordPress更好地识别重写配置,避免一些潜在问题:
define('WP_HOME', 'http://your-domain.com'); // 替换成你的站点域名 define('WP_SITEURL', 'http://your-domain.com'); define('MOD_REWRITE', true);
只要按上面的方法配置好,以后不管实例怎么重启、扩容,固定链接都能正常工作,不用再手动去后台保存配置了。
内容的提问来源于stack exchange,提问作者Giona Granata

