Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 将http、非www重定向到https,子文件夹为www_.htaccess_Redirect_Https - Fatal编程技术网

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

.htaccess 将http、非www重定向到https,子文件夹为www,.htaccess,redirect,https,.htaccess,Redirect,Https,我尝试了在stackoverflow和其他网站上找到的几乎所有的解决方案,但都没能奏效,所以我试着提交我的问题 我的文件夹将是: public\u html/wordpress根文件夹(A) public\u html/wordpress根文件夹/traveltour(B) 我已经安装了Let's Encrypt to(A),它在(B)中工作,而没有在(B)中再次安装Let's Encrypt。但我无法通过www将(B)重定向到HTTPS。我在.htaccess文件中尝试的一些代码: Rew

我尝试了在stackoverflow和其他网站上找到的几乎所有的解决方案,但都没能奏效,所以我试着提交我的问题

我的文件夹将是:

  • public\u html/wordpress根文件夹
    (A)
  • public\u html/wordpress根文件夹/traveltour
    (B)
我已经安装了Let's Encrypt to(A),它在(B)中工作,而没有在(B)中再次安装Let's Encrypt。但我无法通过www将(B)重定向到HTTPS。我在
.htaccess
文件中尝试的一些代码:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

当我通过谷歌搜索找到它的时候,情况就更糟了,但什么都不管用。我希望能得到一些建议,在不使用插件的情况下使用
.htaccess
来解决这个问题,这就是为什么我把我的问题贴在这里,而不是在WordPress StackExchange上


编辑: 如果我尝试加载:(B)使用http和非www,它将保持在http和www之间,或者如果我尝试加载:(B)使用http和www,它将保持不变,不使用https。一些代码将(B)重定向到(A)并使我的链接404找不到,所以我将其删除


编辑2: 我有单独的
.htaccess
文件和控制器结构,如下所示:

  • /public\u html/.htaccess
    (A)
  • /public\u html/B/.htaccess
    (B)
/.htaccess
(A): 如果在子目录(站点B)中的
.htaccess
文件中使用此选项,例如
/traveltour/.htaccess
,则此选项无效,因为它将导致用户在根目录中重定向回站点a。捕获的反向引用
$1
将不包含子目录。您需要使用
REQUEST\u URI
server变量来使用完整的URL路径(正如您在第三个代码块中所做的那样)

另请注意,
SERVER\u NAME
可能不包含所需的值-具体取决于您的系统。默认情况下,
SERVER\u NAME
HTTP\u HOST
相同(主机
HOST
HTTP请求头的值,即请求的主机名),但是,如果在服务器配置中设置了
useCononicalName On
,则这将是
ServerName
指令中设置的主机名的值。可以是非www或www域,也可以是其他完全不同的域(如果您有多个域)。因此,在不了解您的系统的情况下,在这里使用
SERVER\u NAME
不一定是可靠的/通用的解决方案

例如,在
/B/.htaccess
中,在WordPress前端控制器之前:

# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress
:
这与第三个代码块基本相同。
包装器不是必需的,应该省略。您也不需要重复
RewriteEngine On
指令(该指令稍后在文件中出现-在WordPress代码块中)

在根
/.htaccess
文件(站点A)中,您可以使用与上面相同的指令,或者使用带有捕获反向引用的版本-在这种上下文中这并不重要

但是,请注意,这只是HTTP到HTTPS的重定向,它不会规范化www子域。(这通常由WordPress自己处理,方法是在
WP config.php
中设置正确的
WP\u SITEURL
WP\u HOME
值)要在
中处理此问题,可以将上述规则修改为:

# 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(临时)重定向进行测试,以避免潜在的缓存问题。在测试之前,您需要确保浏览器缓存处于清除状态。浏览器会永久缓存301s,因此可能会导致测试出现问题。

安全证书适用于主机名,即
example.com
www.example.com
,而不是URL路径,因此无论是(A)还是(B)都不重要(除非WordPress源代码中存在冲突代码)。你说它不起作用,但到底发生了什么?它解决了吗?重定向循环?错误?没有什么?!如果(A)通过WWW重定向到HTTPS,那么(B)也应该如此——它是同一个域,不是吗?你是如何将(A)和(B)分开的?(B) 只是看起来像一个子目录-所以实际上无论如何都不应该有分离??我需要分离它,因为在每个(a)和(B)中,使用不同的主题进行开发/调试。我不确定是否可以在这里发布一个web链接,所以我没有在我的问题中添加它。但是如果我尝试加载:(B)使用http和非www,它将保持http和www,或者如果我尝试加载:(B)使用http和www,它将保持不变,不使用https。一些代码将(B)重定向到(A)并使我的链接404找不到,所以我已将其删除。这些指令具体放在哪里?您是否有多个
.htaccess
文件(一个用于(A),一个用于(B))?或者所有内容都在根目录下的一个
.htaccess
中?此外,指令的顺序也很重要。这些重定向需要靠近
.htaccess
文件的顶部。重要的是,他们必须走到WordPress前端控制器前面。是的,我忘了更新这个信息。我有多重访问权限。一个用于(A)和一个用于(B)。根目录director:/public\u html中的(A)和:/public\u html/B中提供的另一个。我们需要查看这两个
.htaccess
文件的内容。到目前为止,还没有任何证据表明为什么这不起作用。如前所述,指令的顺序很重要。此外,默认情况下,B中的任何mod_rewrite指令都将完全覆盖A中的任何mod_rewrite指令(除非启用mod_rewrite继承),这可能会使问题复杂化
# 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]
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress
:
# 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]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]