繁体   English   中英

将 http、非 www 重定向到 https,将 www 重定向到子文件夹

[英]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 未找到,因此我已将其删除。


编辑2:

我有单独的.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_NAMEHTTP_HOSTHost HTTP 请求标头的值,即请求的主机名)相同,但是,如果在服务器配置中设置了UseCanonicalName On那么这将是主机名中设置的值ServerName指令。 这可以是非 www 或 www 域,也可以是其他完全不同的域(如果您有多个域)。 因此,在不了解您的系统的情况下,在此处使用SERVER_NAME不一定是可靠/通用的解决方案。

例如,在/B/.htaccessWordPress 前端控制器之前:

# 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_SITEURLWP_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM