【问题标题】:How can I make the wordpress rewrite rules work under a subdirectory?如何使 wordpress 重写规则在子目录下工作?
【发布时间】:2023-03-27 17:48:01
【问题描述】:

我想将进入 wordpress 站点的某些 URL 重定向到文档根目录之外的另一个目录。似乎最简单的方法是让 wordpress 成为一个子目录,但是我怎样才能让它的重写规则重定向到这个子目录呢?

这些是 apache 配置中的标准规则(不是 .htaccess)

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

由于现在我想在目录中添加wordpress,所以我将其更改如下

RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]  

但我得到了

[perdir /] internal redirect with /wordpress/index.php [INTERNAL REDIRECT]

相反。为什么?我最初尝试在规则中手动添加“wordpress”,但显然 %{REQUEST_FILENAME} 存储初始名称而不是重写的名称。

【问题讨论】:

  • 澄清一下,您已经实际移动了 WordPress(以及所有相关文件,包括 URL 中的.htaccess) into that subdirectory? And updated the necessary WP config to include wordpress`?如果您已经这样做了,那么您无需更改“标准” .htaccess 文件。“在 apache 配置中(不是 .htaccess)”——“在 apache 配置中”到底是什么意思——具体在哪里?这些特定指令在 目录之外不起作用> 上下文。
  • 这是另一种方法,但我想看看它是否可以通过纯重写规则来完成,并且可以。 Apache 配置是指httpd.conf 中的虚拟主机配置。当我使用目录上下文时,我在下面的答案中使用的指令会生成重定向循环,因此我将其删除。 (RewriteBase 需要它,但我最终没有走那条路)。
  • “纯重写规则”——这些都是“纯重写规则”吗?如果您的意思是不使用RewriteBase,那么在目录 上下文中RewriteBase 是您可以使用的工具(如果需要),没有理由避免使用它。 “Apache 配置是指 httpd.conf 中的虚拟主机配置” - 如果直接在 <VirtualHost> 容器中使用,上述指令将“中断” - 它们需要在 <Directory> 容器中,在 <VirtualHost> 内- 这会改变 context.

标签: wordpress apache .htaccess


【解决方案1】:

我最终按照我在查询末尾建议的方式进行操作,根本没有使用 RewriteBase。

RewriteRule ^index\.php$ /wordpress/index.php [L]
#this rule prepends wordpress to everything
RewriteRule "^(.*)$" /wordpress/$1

#now the files have wordpress prepended, but without directory context, these conditions compare against the whole path 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
# we exclude files with wordpress prepended
RewriteRule ^((?!wordpress).*)$ /wordpress/index.php [L]

我简要提到了 REQUEST_FILENAME 不起作用,我通过将 LogLevel 提高到 rewrite:trace6 来找出原因。它确认 REQUEST_FILENAME 正在由 RewriteRules 更新,但没有目录上下文(即 ),它期望文件/目录的完整路径。所以我通过在前面加上 %{DOCUMENT_ROOT} 来解决这个问题,现在代码可以工作了。

【讨论】:

  • 如果您在 virtualhost(或 server)上下文中使用这些规则,那么 REQUEST_FILENAMEREQUEST_URI 相同,因为这些规则在 URL 映射到文件系统之前进行处理。所以,是的,您需要预先添加文档根目录以检查文件系统。或者,改为使用基于 URL 的前瞻,例如。 %{LA-U:REQUEST_FILENAME}。但是,这不适用于在 directory 上下文中使用指令时(即在<Directory> 容器或.htaccess 中)。
  • 请注意,如果在 virtualhost 上下文中使用,此行:RewriteRule "^(.*)$" /wordpress/$1 将导致在 wordpress 之后出现双斜杠,因为 URL 路径与 @ 匹配987654329@ 指令是根相关的(以斜杠开头)。
猜你喜欢
  • 2018-07-06
  • 2012-02-11
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
相关资源
最近更新 更多