gpt4 book ai didi

php - 如果连接为纯HTTP,尝试了解用于重定向到HTTPS的不同方法

转载 作者:行者123 更新时间:2023-12-04 14:21:27 28 4
gpt4 key购买 nike

因此,我在互联网上看到了几种不同的方法,但是我不确定它们之间的实际区别是什么,或者为什么一种方法优于另一种方法。


改写规则




RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}



重定向规则




<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost >

<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost >



重定向PHP




if($_SERVER['HTTPS'] != "on") {
$redirect = "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
header("Location:$redirect");
exit();
}


目前,我使用的是#3,我将其放在单独的文件中,并将其包含在任何需要HTTPS的页面中。

这是不好的做法吗?我应该使用其他方法来使用HTTPS吗?

最佳答案

简短的答案。

通常,所有这些都属于“依赖”规则。

但是对于您显示的示例,我想说,将Redirect "/" "https://www.example.com/"放在纯HTTP站点上的.htaccess文件中是最好的方法。请注意,如果您要处理的是特定页面,而我不知道您的网站布局是什么样的,那么该.htaccess文件中的条目可能看起来像这样:

Redirect "/login.php" "https://www.example.com/login.php"
Redirect "/account.php" "https://www.example.com/account.php"
Redirect "/starwars_spoilers.php" "https://www.example.com/starwars_spoilers.php"


更长的答案。

您问这个:


因此,我在互联网上看到了几种不同的方法,但我没有
确定它们之间的实际区别是什么,或者为什么更好
比其他。


以我的拙见,我认为所有这些方法都是有效的,但每种方法都有自己的怪癖和特质,具体取决于使用情况和系统需求。根据您的描述,我建议在 .htaccess文件中使用方法编号1或2,并将其放置在需要强制HTTPS连接的服务器代码库中。但是,如果您的编码要求超过简单的“是否是HTTPS?”,我只会使用PHP方法。逻辑。

这是我的细分。


重写规则:Apache服务器 mod_rewrite方法。

可靠的服务器级别方法。在执行此方法之前,您的PHP代码不会运行。这使用Apache mod_rewrite模块允许使用 RewriteCondRewriteRule之类的命令。同样,关于此方法的好处是,它可以直接在网站根目录的 .htaccess文档中使用,以影响该网站上任何目录中的所有子内容。或者可以在单独的目录中使用。这里的好处是,如果连接不是HTTPS( RewriteCond %{HTTPS} !on),那么所呈现的逻辑很简单,那么只需将流量重定向到等效的HTTPS( RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}),您就可以在提供HTTP和HTTPS的通用代码目录中使用它让它做“令人担忧”。

也就是说,这些东西不仅可以在 .htaccess文件中使用,而且可以在服务器级Apache配置文件中使用。主要区别在于,虽然 .htaccess文件可以由具有读/写访问权限的任何用户即时编辑,并且更改会立即出现,但是如果在Apache配置文件中使用它,则用户通常需要具有 root / 不仅可以编辑文件,还可以重新启动Apache Web服务以获取规则 sudo规则。

通常,对于这样的一组 mod_rewrite命令,我实际上更喜欢将它们直接放置在服务器Apache配置文件中(在本例中为端口80,是普通的HTTP配置块/区域),因为这样的配置太深了广泛来说,我确实认为您只需设置一次即可。与 RewriteRule方法相比,此方法的负面影响是随着时间的流逝,您可能还会忘记这样做。因此,如果将代码迁移到新服务器上并突然启用HTTP连接,您可能会感到恐慌……直到后来才意识到您做到了。因此,在这个简单的示例中,这就是为什么我相信所呈现的代码逻辑最好放在一个 .htaccess文件中,该文件可以放置在通常访问的内容目录中。
重定向规则:Apache服务器 .htaccess方法。

可能适合您“每页”的基本服务器级别方法需要更好。在执行此方法之前,您的PHP代码不会运行。这使用Apache mod_alias模块允许使用 mod_rewriteAlias之类的命令。看到此方法的最好方法是 Redirect的第一项工作是允许您创建可以将Web URL路径映射到文件系统路径的别名。对我来说,这是一项非常出色的功能,但实际上不适用于您在此处描述的将纯HTTP请求重定向到安全的问题。它的辅助功能是创建一个称为 mod_alias的网络URL别名,这是重定向流量的简单方法。

对于您的简单要求, Redirect命令可用于相当“笨拙”的重定向任务,并且在此很有用。但是对于任何需要更多技巧的东西来说,它是没有用的。哪一个对您有用?

在您发布的示例中,您将显示 Redirect配置块,它是较大的Apache服务器端配置的一部分,该配置需要 <VirtualHost *:80> / root进行设置。但是说实话,核心 sudo就是您所需要的,您也可以将它放在纯HTTP站点上的 Redirect "/" "https://www.example.com/"文件中。根据您网站代码的复杂性和您个人的舒适度,在 .htaccess文件中使用此 Redirect可能是最好的“设置后忘了”解决方案。一行,干净,可读和可理解。
重定向PHP:基于代码的方法。

现在这在技术上是可行的,但只有在您具有更深的编码逻辑和需求时,才应该真正使用类似的东西。举例来说,这意味着您拥有一个网站,该网站的公共前端确实不需要HTTPS,而是希望将其保留在HTTP上(因为HTTP所需的系统开销比HTTPS少),并且仅在经过某些代码逻辑后才重定向到HTTPS连接触发器。像管理员登录之类的。

这种方法的不利方面是,除非您有一个集中的PHP控制器文件,否则这很难维护。同样,如果重定向发生在PHP中而不是在服务器级别,则从技术上讲,这意味着从服务器到服务器的任何连接都需要先解析PHP逻辑,然后才能知道该怎么做。由于需要解析PHP,这会给您的代码库增加一点开销,并且可能会打开潜在的代码漏洞,该漏洞可能有效地禁用HTTPS代码。意思是,当网站被黑客入侵时,这实际上不是在Apache Web服务器级别上发生的,而是在发生PHP之类的编码级别上发生的。如果HTTPS和安全性对您很重要,则仅依靠PHP代码来处理重定向决策和连接强制可能不是一个好主意。


最后一点要点是,这是对哪种放置方法更多/更少的资源密集型以及用户和管理员级别访问的细分:


Apache .htaccessmod_rewrite命令直接在Apache配置文件中。占用最少的资源,但是需要 mod_alias / root级别的访问权限才能进行配置和访问。
sudo文件中的Apache mod_rewritemod_alias命令。由于Apache必须在每个请求中解析 .htaccess文件,因此服务器上的资源消耗略多,但是说实话,除非您的服务器的流量过高或令人不快的资源匮乏,否则您不会注意到 .htaccess文件的速度差异。很好,因为您可以成为具有读/写访问权限的普通/非 .htaccess用户进行调整。
PHP代码逻辑。效率最低,因为需要解析PHP才能执行逻辑。而且由于它是在其他Apache事情发生之后发生的,因此该安全漏洞有轻微的边缘风险。但是这样做的好处是,您可以成为具有读/写访问权限的普通/非 root用户,以便在需要时调整逻辑。而且,如果您尝试使用 root进行相同的逻辑处理,则可以根据代码需求使用PHP逻辑进行更复杂的事情,而不必学习本质上是另一种语言。


奖励:如何从命令行调试类似的东西。

在处理重定向和类似的事情时,重新加载Web浏览器可能会很痛苦且不准确。当您加载网页进行此类测试时,所有内容(包括资产)都需要由浏览器下载和缓存。不仅如此,还需要清除缓存的内容才能进行测试。这种调试确实占用大量资源。相反,我建议从命令行使用 mod_rewrite命令来调试返回的标头,我发现这是一种调试此类事情的更简便方法。

首先像这样在 curl -I文件中设置命令:

Redirect "/" "https://www.example.com/"


将其保存在服务器上,然后运行如下所示的 .htaccess命令:

curl -I http://www.example.com/


返回的输出应该是这样的:

HTTP/1.1 302 Found
Date: Tue, 22 Dec 2015 01:43:32 GMT
Server: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8zg DAV/2 PHP/5.4.10
Location: https://www.example.com/
Content-Type: text/html; charset=iso-8859-1


注意顶部的第一个 curl -I标头和底部的 HTTP值。 Location:表示重定向是临时的, 302 Found告诉浏览器重定向到何处。

就是说,在这种情况下,您可能需要更改 Location: https://www.example.com/中的 Redirect以将标头设置为 .htaccess标头,这对于SEO更好,并且说实话正在描述您的工作;所有HTTP流量都将永久重定向到HTTPS。您可以这样做:

Redirect "/" "https://www.example.com/"


对此:

Redirect 301 "/" "https://www.example.com/"


您只需要做的就是在 301 Moved Permanently之后添加 301。然后,用 Redirect再次检查标题,现在输出应为:

HTTP/1.1 301 Moved Permanently
Date: Tue, 22 Dec 2015 01:54:51 GMT
Server: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8zg DAV/2 PHP/5.4.10
Location: https://www.example.com/
Content-Type: text/html; charset=iso-8859-1

关于php - 如果连接为纯HTTP,尝试了解用于重定向到HTTPS的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com