
本文详细阐述了如何通过修改 `.htaccess` 文件,将主域名流量精确重定向至 wordpress 子目录,并确保原始 url 路径的完整保留。教程涵盖了主域名根目录和子目录 `.htaccess` 文件的关键配置调整,特别是 `rewriterule` 中捕获组 `$1` 的应用,以及子目录 `rewritebase` 和 `rewriterule` 的正确设置,旨在解决重定向后路径丢失的问题。
在将网站从主域名(例如 example.com)重定向到其子目录(例如 example.com/fr)时,常见的挑战是确保所有子路径(如 example.com/path/to/page)在重定向后能够正确地映射到 example.com/fr/path/to/page,而不是简单地全部重定向到 example.com/fr/。这通常是由于 .htaccess 文件中的 RewriteRule 配置不当,未能正确捕获并传递原始请求的路径信息所致。此外,WordPress 在子目录中运行时,其内部重写规则也需要相应的调整。
主域名根目录下的 .htaccess 文件负责处理所有进入主域名的请求,并将其重定向到目标子目录。关键在于 RewriteRule 的设置,它必须能够捕获原始请求中的完整路径,并将其附加到新的重定向 URL 中。
原始配置(可能导致路径丢失): 如果您的主域名 .htaccess 文件中的重定向规则类似于以下形式,它将导致所有请求都被重定向到 https://example.com/fr/,而丢失原始路径:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/fr/ [L,R=301,NC]上述规则中,重定向目标 https://example.com/fr/ 缺少了对原始请求路径的引用,因此所有子路径都将被丢弃。
正确的配置方法: 为了保留路径,我们需要在 RewriteRule 中使用正则表达式的捕获组。^(.*)$ 会捕获请求 URI 的所有内容(除了域名部分),并将其存储在 $1 变量中。然后,我们可以在重定向目标 URL 中引用这个 $1,从而将原始路径附加到子目录 URL 之后。
请将主域名根目录下的 .htaccess 文件中的相关 RewriteRule 修改为:
RewriteEngine on
# 检查请求的主机是否为 example.com 或 www.example.com
RewriteCond %{HTTP_HOST} ^example.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
# 将所有请求(包括路径)301重定向到 https://example.com/fr/,并保留原始路径
RewriteRule ^(.*)$ https://example.com/fr/$1 [L,R=301,NC]
# 以下是标准的WordPress规则,请确保其保持不变,除非您有特殊需求
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress解释:
通过此修改,例如 example.com/about 将被正确重定向到 https://example.com/fr/about。
当 WordPress 安装在子目录(例如 /fr/)中时,其自身的 .htaccess 文件也需要进行调整,以确保 WordPress 能够正确解析其内部链接和固定链接结构。最主要的变化是 RewriteBase 指令,它需要反映 WordPress 实际所在的子目录路径。
原始子目录配置(可能导致问题): 标准的 WordPress .htaccess 规则在根目录下运行时是有效的,但在子目录中,RewriteBase / 和 RewriteRule . /index.php [L] 会导致 WordPress 无法正确找到其资源或处理请求。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress正确的配置方法: 在 /fr/ 子目录下的 .htaccess 文件中,您需要修改 RewriteBase 和主 RewriteRule,使其指向 /fr/ 路径。
请将 /fr/ 目录下的 .htaccess 文件修改为:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# 将 RewriteBase 修改为子目录的路径
RewriteBase /fr/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将主 RewriteRule 的目标路径修改为子目录的 index.php
RewriteRule . /fr/index.php [L]
</IfModule>
# END WordPress解释:
通过对主域名根目录和 WordPress 子目录中的 .htaccess 文件进行精确配置,我们可以实现无缝且路径完整的重定向。关键在于主目录 RewriteRule 中对 $1 捕获组的正确使用,以及子目录 RewriteBase 和 WordPress 核心 RewriteRule 的相应调整。遵循这些步骤并进行充分测试,将确保您的 WordPress 网站在子目录中稳定运行,并提供一致的用户体验。
以上就是使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号