[英]Redirect http, non-www to https, with www for subfolder
我尝试了几乎所有我可以在 stackoverflow 和其他网站上找到的解决方案,但我无法让它工作,所以我尝试提交我的问题。
我的文件夹将是:
public_html/wordpress root folder
(A)public_html/wordpress root folder/traveltour
(B) 我已经将 Let's Encrypt 安装到 (A) 并且它适用于 (B) 而无需在 (B) 中再次安装 Let's Encrypt。 但是我无法使用 www 将 (B) 重定向到 HTTPS。 我在.htaccess
文件中尝试过的一些代码:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>
#force https
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
当我通过谷歌搜索找到它时,还有更多,但没有任何效果。 我希望得到一些建议,在不使用插件的情况下使用.htaccess
解决它,这就是我在这里而不是在 WordPress StackExchange 上发布我的问题的原因。
如果我尝试加载:(B)使用 http 和非 www,它会停留在带 www 的 http,或者如果我尝试加载:(B)使用 http 和 www,它保持不变,没有 https。 一些代码将 (B) 重定向到 (A) 并使我的链接 404 未找到,因此我已将其删除。
我有单独的.htaccess
文件和如下所示的导演结构:
/public_html/.htaccess
(A)/public_html/B/.htaccess
(B)/.htaccess
(A):# BEGIN WordPress
# The directives (lines) between `BEGIN WordPress` and `END WordPress` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
/B/.htaccess
(B):# BEGIN MainWP
# The directives (lines) between `BEGIN MainWP` and `END MainWP` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
# END MainWP
# BEGIN WordPress
# The directives (lines) between `BEGIN WordPress` and `END WordPress` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /traveltour/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /traveltour/index.php [L]
</IfModule>
# END WordPress
# BEGIN SSL
# END SSL
RewriteCond %{HTTPS} off RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
如果在子目录(站点 B)中的.htaccess
文件中使用,这将不起作用,例如。 /traveltour/.htaccess
,因为它会导致用户被重定向回根目录中的站点 A。 捕获的反向引用$1
将不包含子目录。 您将需要使用REQUEST_URI
服务器变量来使用完整的 URL 路径(正如您在第三个代码块中所做的那样)。
另请注意, SERVER_NAME
可能不包含所需的值 - 取决于您的系统。 默认情况下, SERVER_NAME
与HTTP_HOST
( Host
HTTP 请求标头的值,即请求的主机名)相同,但是,如果在服务器配置中设置了UseCanonicalName On
那么这将是主机名中设置的值ServerName
指令。 这可以是非 www 或 www 域,也可以是其他完全不同的域(如果您有多个域)。 因此,在不了解您的系统的情况下,在此处使用SERVER_NAME
不一定是可靠/通用的解决方案。
例如,在/B/.htaccess
,在WordPress 前端控制器之前:
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# BEGIN WordPress
:
这与您的第三个代码块基本相同。 <IfModule>
包装器不是必需的,应该省略。 您也不需要重复RewriteEngine On
指令(发生在文件的后面- 在 WordPress 代码块内)。
在根/.htaccess
文件(站点 A)中,您可以使用与上述相同的指令,或者使用捕获反向引用的版本 - 在此上下文中无关紧要。
但是请注意,这只是 HTTP 到 HTTPS 的重定向,它不会规范 www 子域。 (这通常由 WordPress 本身通过在wp-config.php
设置正确的WP_SITEURL
和WP_HOME
值来处理。)要在.htaccess
处理此问题,您可以将上述规则修改为:
# Redirect HTTP to HTTPS and non-www to www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
这确实假设您没有其他需要访问的子域,因为所有内容都重定向到 www。
如果您想要一个未明确提及域名的“通用”解决方案(尽管这不一定是最佳选择 - 取决于您的系统),那么您可以执行以下操作:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
%1
反向引用匹配请求的主机名减去www.
前缀(如果有的话)。
同样,这将适用于/.htaccess
和/B/.htaccess
文件。
您应该首先测试 302(临时)重定向以避免潜在的缓存问题。 在测试之前,您需要确保浏览器缓存清晰。 301 由浏览器持久缓存,因此可能会使测试出现问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.