重定向索引页的哪个选项是正确的:网站的 HTTP 或 HTTPS 版本?

Which option is correct to redirect the index page: HTTP or HTTPS version of the website?

提问人:Regis 提问时间:4/26/2023 最后编辑:MrWhiteRegis 更新时间:4/26/2023 访问量:55

问:

我对文件或 Web 服务器配置知之甚少,我一直在试图弄清楚为什么我的网站文件被重定向到 HTTP 版本而不是 HTTPS。几天来我一直在寻找答案,但我找不到任何可以解释它的东西。.htaccessindex.php

这就是问题所在。我的文件中有以下规则:.htaccess

# Do not remove this line, otherwise mod_rewrite rules will stop working
RewriteBase /
RewriteCond %{HTTP_HOST} ^mywebsite\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.mywebsite\.com$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^index\.php$ "http\:\/\/www\.mywebsite\.com\/" [R=301,L] 

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

我的问题是关于这一行:.RewriteRule ^index\.php$ "http\:\/\/www\.mywebsite\.com\/" [R=301,L]

考虑到我的网站使用 HTTPS,重定向到 HTTP 版本是否正确,如最后一行所述?index.php

我担心这条规则是否会导致问题,如果这是预期的行为。我想确保我正确地重定向到适当的协议。我在日志中得到了很多 302 状态代码,我想这可能是因为重定向是错误的,应该重定向到该网站的 https 版本。

我真的在为这个问题而苦苦挣扎,我找不到答案。我无能为力,因为我担心错误的更改会对网站造成伤害。如果有人能帮助我了解正在发生的事情,我将不胜感激。

Apache .htaccess 重定向 mod-rewrite https

评论

0赞 MrWhite 4/26/2023
您的文件中还有其他指令吗?您是否托管多个域名?.htaccess
0赞 Regis 4/26/2023
只有一个域。是的,我在文件末尾还有其他指令: RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
0赞 MrWhite 4/26/2023
请使用其他信息/代码更新您的问题。您应该包括完整的文件。(注释中的无格式代码是无法读取的,因为正则表达式中的特殊字符经常被省略。.htaccess
0赞 Regis 4/26/2023
对不起。我刚刚编辑了我的问题。
0赞 MrWhite 4/26/2023
我已经根据您更新的问题更新了我的答案。

答:

2赞 MrWhite 4/26/2023 #1

我一直在试图弄清楚为什么我的网站的 index.php 文件被重定向到 HTTP 版本而不是 HTTPS。

你在问题的后面确定了“为什么”......

考虑到我的网站使用 HTTPS,将 index.php 重定向到 HTTP 版本是否正确,如最后一行所述?

但是不,这不是“正确的”,如果有的话,您应该重定向到 HTTPS。(回到你...当您的网站在 HTTPS 上运行时,为什么要重定向到 HTTP?这是没有意义的,显然是一个错误。更新:特别是因为您将在下一条规则中重定向到 HTTPS!

我的日志中有很多 302 状态代码

更新:根据更新的问题,您的第二条规则(HTTP 到 HTTPS 重定向)是 302(临时)重定向。如果您在第一个规则中重定向到 HTTP,那么第二个规则将通过第二个重定向来“纠正”这一点!

但是,您不应该在日志中获得“大量”302,因为您一开始就不应该链接到。(?)/index.php

仔细看看你的指令......

# Do not remove this line, otherwise mod_rewrite rules will stop working
RewriteBase /

该注释可能指的是文件后面出现的行?此处不需要该指令(未使用它),应将其删除。RewriteEngine OnRewriteBase

RewriteCond %{HTTP_HOST} ^mywebsite\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.mywebsite\.com$

由于您(在评论中)表示您只有一个域,因此不需要这两个条件。

RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$

这些条件由cPanel自动添加。但是,在第一条规则中,它们不是必需的,可以删除。(如果请求的 URL 是,那么 URL 显然不会是这些 URL 之一 - 所以条件是无稽之谈。但就像我说的,这些条件是在每条规则之前盲目添加的——真的有点乱。/index.php

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

您缺少最后一条规则上的 and 标志。因此,这默认为 302(临时)重定向。它应该是 301(永久)重定向。R=301L


总而言之,你的规则可以写得更简单,如下所示:

RewriteEngine On

# Redirect "/index.php" to "/" (and HTTPS)
RewriteRule ^index\.php$ https://%{HTTP_HOST}/ [R=301,L] 

# Redirect HTTP to HTTPS (except for the ".well-known" directory)
RewriteCond %{HTTPS} off
RewriteRule !^\.well-known/ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

我在 HTTP 到 HTTPS(第二个)规则中使用了更宽泛的方法,并排除了指向子目录的所有 URL。(尽管 cPanel 可能会在 SSL 证书自动续订时重新添加这些条件!/.well-known

在替换字符串中不需要所有这些反斜杠转义符(这是典型的 cPanel)。

请注意,这并不能规范 www 与非 www。这是留给读者的练习。

评论

0赞 Regis 4/26/2023
谢谢,伙计。在我真正的htaccess中,我将该行中的http更改为https。你现在怎么看?
0赞 MrWhite 4/26/2023
@Regis 是的,正如我的回答中所说,那一行应该是 ,而不是 。在我回答的最后一部分,我包括了一个(基本上)相同规则的更简化版本。但是,如前所述,您不应该在 HTML 锚点中链接到,否则您仍然会在日志中获得大量(不必要的)301(这也对您的用户不利)。https://http://index.php
1赞 Regis 4/28/2023
答案是肯定的。大功告成。顺便说一句,我正在使用你的答案,在我的网站上稍作修改,到目前为止一切似乎都不错。多谢。