重写 URL 子目录
Rewrite URL Sub directory
我想将非 www URL 重定向到 www。
我有一个主要的 wordpress 网站 example.com
和一个子目录中的另一个网站 `example.com/sub
从 https://example.com
到 https://www.example.com
的重定向有效
但
从 https://example.com/sub
到 https://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
服务器变量包含斜杠前缀,因此 替换 字符串中省略了斜杠。
我想将非 www URL 重定向到 www。
我有一个主要的 wordpress 网站 example.com
和一个子目录中的另一个网站 `example.com/sub
从 https://example.com
到 https://www.example.com
的重定向有效
但
从 https://example.com/sub
到 https://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
服务器变量包含斜杠前缀,因此 替换 字符串中省略了斜杠。