重写 URL 子目录

Rewrite URL Sub directory

我想将非 www URL 重定向到 www。 我有一个主要的 wordpress 网站 example.com 和一个子目录中的另一个网站 `example.com/sub

https://example.comhttps://www.example.com 的重定向有效 但 从 https://example.com/subhttps://www.example.com/sub 的重定向不会。

主要 HTaccess

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/ [R=301,L]

子 htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /sub/
RewriteCond %{HTTPS} on [OR]
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https
RewriteRule .* - [E=WPR_SSL:-https]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteRule .* - [E=WPR_ENC:_gzip]
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP:Cookie} !(wordpress_logged_in_.+|wp-postpass_|wptouch_switch_toggle|comment_author_|comment_author_email_) [NC]
RewriteCond %{REQUEST_URI} !^(/sub(/(.+/)?feed/?.+/?|/(?:.+/)?embed/|/(index\.php/)?wp\-json(/.*|$)))$ [NC]
RewriteCond %{HTTP_USER_AGENT} !^(facebookexternalhit).* [NC]
RewriteCond "%{DOCUMENT_ROOT}/sub/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}%{ENV:WPR_WEBP}.html%{ENV:WPR_ENC}" -f
RewriteRule .* "/sub/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}%{ENV:WPR_WEBP}.html%{ENV:WPR_ENC}" [L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /sub/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /sub/index.php [L]
</IfModule>

这与最近提出的这个问题非常相似:

当问题是每个目录 .htaccess 文件时,您可以通过使用 [END] 标志阻止这些文件中的规则在一些规则之后 运行。来自 documentation:

Using the [END] flag terminates not only the current round of rewrite processing (like [L]) but also prevents any subsequent rewrite processing from occurring in per-directory (htaccess) context.

因此您应该能够在您的规则中使用 [END] 使它们优先于子目录中的其他规则:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/ [R=301,END]

.htaccess 文件中的非 www 到 www 重定向未被处理,因此重定向永远不会发生。

mod_rewrite 指令不被继承(默认情况下),因此当您请求 https://example.com/sub/ 时,/sub/.htaccess 中的 mod_rewrite 指令完全覆盖父指令(即非 www 到 www 重定向)并且甚至不处理父指令,因此不会发生重定向。 (在这种情况下,如果父指令确实得到处理,那么您的网站肯定会崩溃。)

您需要在 /sub/.htaccess 文件中重复非 www 到 www 的重定向。但是,您不能在子目录中使用完全相同的规则(使用反向引用),因为您将从重定向中丢失 /sub 目录。您需要改用 REQUEST_URI 服务器变量。

例如,在您的 /sub/.htaccess 文件的顶部:

# /sub/.htaccess

# Redirect non-www to www
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]

请注意,REQUEST_URI 服务器变量包含斜杠前缀,因此 替换 字符串中省略了斜杠。