我正在将以前的静态网站迁移到 WordPress 4.3.1。大多数事情都运行良好,但我有一个奇怪的情况:我需要example.com/foo/
动态,但我需要example.com/foo/bar/
静态。我创建了一个/foo/bar/index.html
来处理example.com/foo/bar/
,但现在example.com/foo/
给出了 403 Forbidden 代码。
我还需要example.com/foo/bar/
出现在菜单中,我已经通过添加动态实现了example.com/foo/bar/
这一点(删除它没有帮助)。
该example.com/foo/
页面仍然存在,可以在管理员中编辑。为什么我得到 403 错误,我该如何修复它?
答案1
发生这种情况的原因是 WordPress Apache 重写规则将所有内容传递给 WordPress,而不存在文件或目录文件系统,这两条RewriteCond
规则就是检查这个。但是你做在文件系统上有一个与之对应的目录/foo/
,导致 Apache 在内部处理它。
要解决这个问题,您需要明确告诉 Apache 将其传递给 WordPress(并对可能有目录从第一个重写规则屏蔽它们的任何其他 URL 执行此操作)。
在结束之前添加一段新的指令IfModule
:
RewriteCond %{REQUEST_URI} "/foo/" [OR]
RewriteCond %{REQUEST_URI} "/bar/" [OR]
RewriteCond %{REQUEST_URI} "/baz/"
RewriteRule . /index.php [L]
至于 WordPress 菜单,您不应添加空白页来向其中添加条目。相反,只需使用指向静态页面的所需 URL 创建自定义菜单条目即可。单击菜单编辑器中的自定义链接并添加所需信息。
答案2
我必须修改我的 DirectoryIndex 配置。
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
这些是我的针对混合静态内容的 WordPress 的 /etc/workpresss/access 规则
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Content rewrites go here
# Serve static content
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Use WordPress for rest of the content
RewriteRule . /index.php [L]
</IfModule>
编辑:403 是禁止访问消息。这可能是 Apache 中的 ACL 或 WordPress 目录上的权限问题。403 的原因可能会记录在 Apache 错误日志中。
由于您有一个独立的目录树,因此您应该能够对静态代码使用Location
或指令。这是我使用的变体。Directory
<Location /foo/bar/>
Options +Indexes +FollowSymLinks +MultiViews
AllowOverride None
Require all granted
</Location>