使用 PHP 仅在某些页面上强制使用 SSL

Force SSL only on certain pages with PHP

我找到了一种解决方案,可以将我的 WordPress 网站上的一个页面设置为使用 https,尽管我正在尝试将 ssl 应用于两个页面而不是一个页面。我尝试了各种 if 或语句,但似乎无法获得正确的语法。

下面是我的 if 语句,在一页上运行得很好:

if (!empty($_SERVER['HTTPS']) && !empty($_SERVER['REQUEST_URI']))
   { 
   if ($_SERVER['HTTPS'] == 'on' && $_SERVER['REQUEST_URI'] != '/bill-pay/')
       {
         header("Location:http://example.com{$_SERVER['REQUEST_URI']}", 301);
         exit;
       }
   elseif ($_SERVER['HTTPS'] != 'on' && $_SERVER['REQUEST_URI'] == '/bill-pay/') 
       {
         header("Location: https://example.com{$_SERVER['REQUEST_URI']}", 301);
         exit;
       }
   }

为了清楚起见,我只添加了适用于一页的版本。

本以为直截了当...

if (!empty($_SERVER['HTTPS']) && !empty($_SERVER['REQUEST_URI']))
{ 
   if ($_SERVER['HTTPS'] == 'on' && !($_SERVER['REQUEST_URI'] == '/bill-pay/' || $_SERVER['REQUEST_URI'] == '/other-page/'))
   {
     header("Location:http://example.com{$_SERVER['REQUEST_URI']}", 301);
     exit;
   }
   elseif ($_SERVER['HTTPS'] != 'on' && ($_SERVER['REQUEST_URI'] == '/bill-pay/' || $_SERVER['REQUEST_URI'] == '/other-page/')) 
   {
     header("Location: https://example.com{$_SERVER['REQUEST_URI']}", 301);
     exit;
   }
}

...应该可以解决问题

编辑

考虑到评论,此代码可能更合适:

if (isset($_SERVER['REQUEST_URI']) && ($_SERVER['REQUEST_URI'] == '/bill-pay/' || $_SERVER['REQUEST_URI'] == '/other-page/'))
{
   if (!isset($_SERVER['HTTPS']) || empty($_SERVER['HTTPS'])) 
   {
      header("Location: https://example.com{$_SERVER['REQUEST_URI']}", 301);
      exit;
   }
} 
else 
{
   if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS'])) 
   {
      header("Location: http://example.com{$_SERVER['REQUEST_URI']}", 301);
      exit;
   }
}

请记住,如果未设置值,empty() 将解析为 false ;)

请记住,仅有效地保护站点的一部分意味着几乎没有任何安全性。通过 MITM 或其他漏洞,攻击者可以轻松地将安全页面的链接重写到攻击者控制下的外部页面。

请记住,SSL 不仅与安全连接有关,而且与证明您(=您的网站)的真实身份有关。请务必保护您的整个网站,运行 通过 SSL Labs,遵循其建议。这对每个人都更好,尤其是您的客户。