Sunucu yararlı hiçbir şey geri gönderilmesinde HTTP vs HTTPS tespit

2 Cevap php

Yani bir çeşit çok için "Detecting https requests in php" benzer:

Https://example.com/pog.php http://example.com/pog.php hatta tam tersi gitmek zorunda istiyorum.

Sorunlar:

  • Orada değil çünkü $ _SERVER ["HTTPS"] şey okuyamaz
  • Sunucu bağlantı noktası 80 üzerinden hem isteklerini gönderiyor, yani HTTPS sürümü 443 için kontrol edemiyorum
  • apache_request_headers() ve apache_response_headers() Aynı şeyi geri gönderiyor
  • LoadBalancer şey söyleyemem ya da ekstra somethings gönderdin
  • Sunucu geri besleme verileri hem URL aramalarda sayfası tarafından dışarı tükürdü tam aynı oturum kimliği kaydedebilirsiniz. Serseri.

Bu SSL veya non-SSL üzerinden çağrıldığını eğer herhangi bir tespit sayfa yolları var mı?

Edit: SSL veya non-SSL ile yerinde arıyorsanız $_SERVER["HTTPS"] yok, ya da hiçbir madde geçti. Nedense barındırma şifreli HTTPS tüm isteklere hizmet için seçti, ancak bağlantı noktası 80 aşağı. Ve böylelikle, $_SERVER["HTTPS"] bu sunucu noktada sadece hayır yararlı geribildirim, orada, üzerinde asla. Böylece parametre her zaman boş olacak.

(Ve evet, o da kısmen geçersiz bir SSL sertifikası için söylemek FF veya Chrome'da bayraklı alır demektir. Ama bu kısım önemli değil.)

Ayrıca, URL tespit kazanılmış olabilir ki en bölü noktaya kadar olduğunu. Isteği ön https veya http varsa PHP göremiyorum.

2 Cevap

Keyword -- Load Balancer

Sorun yük dengeleyici SSL şifreleme / şifre çözme işleme olduğunu aslında aşağı kaynar ve web sunucusu tamamen şeffaftır.

Request:  Client -> 443or80 -> loadbalancer -> 80 -> php
Response: PHP -> 80 -> loadbalancer -> 443or80 -> Client

The real question here is "do you have control over the load balancer configuration?"


If you do, işlemek için bir kaç yolu vardır. HTTP ve HTTPS için ayrı hizmet tanımlarını için yük dengeleyici yapılandırın. Sonra webserver'lerin limanına 81 trafik web sunucularının port 80 HTTP trafiği göndermek, ve HTTPS. (Port 81 başka bir şey tarafından kullanılır).

Apache yılında, iki farklı sanal konakları yapılandırmak:

<VirtualHost 1.2.3.4:80>
   ServerName foo.com
   SetEnv USING_HTTPS 0
   ...
</VirtualHost>

<VirtualHost 1.2.3.4:81>
   ServerName foo.com
   SetEnv USING_HTTPS 1
   ...
</VirtualHost>

0, hangi bağlı olarak sanal konak aldım | Sonra, ortam değişkeni "USING_HTTPS" 1 ya olacak. Yani PHP $ _SERVER dizisinde sunulacak. Harika değil mi?


If you do not have access to the Load Balancer configuration, sonra işler biraz tricker vardır. HTTP ve HTTPS protocols çünkü, HTTP veya HTTPS kullanan olup olmadığını kesin olarak bilmek için bir yol olmayacaktır. Bunlar arasında bilgi göndermek bağlanmak ve ne biçim nasıl belirleyebilirsiniz, ancak her iki durumda da, bu isteği yapmak için HTTP 1.1 kullanıyor. HTTP veya HTTPS olup olmadığını söylemek için gerçek bir istek hiçbir bilgi yoktur.

Ancak kalp kaybetmek yok. Fikirlerin bir çift vardır.

PHP'nin setcookie 6 parametre () fonksiyonu SADECE HTTPS bağlantısı üzerinden çerez göndermek için bir istemci talimat verebilirsiniz (http://www.php.net/setcookie). Belki de bu parametre ile bir cookie ve daha sonraki isteklerinde bunun için kontrol edebilir?

Bir başka olasılık (GET parametresi ekleyerek) protokolüne bağlı olarak her sayfada bağlantıları güncelleştirmek için javascript kullanmak olacaktır.

(neither of the above would be bullet proof)

Başka bir pragmatik bir seçenek gibi "secure.foo.com" gibi farklı bir etki, üzerinde SSL almak olacaktır. Sonra yukarıdaki VirtualHost kandırmak için çare olabilir.


Ben (SSL modülü ile bir Cisco CSS yük dengeleyici arkasında dengeli web küme yük) gün boyunca onunla başa çünkü bu kolay mesele değil biliyorum.

Son olarak, her zaman web uygulaması gerektiğinde SSL moduna geçmek, ve (tüm sonra, (genellikle) hattı üzerinde kendi veri) geri taşımak için değil kullanıcıların güvenmeliyiz perspektif alabilir.

Bu biraz yardımcı olur umarım.

$_SERVER["HTTPS"] isn't there, switched on or not, no matter if you're looking at the site via SSL or non-SSL. For some reason the hosting has chosen to serve all the HTTPS requests encrypted, but down port 80. And thusly, the $_SERVER["HTTPS"] is never on, not there, just no helpful feedback on that server point. So that parameter is always be empty.

Sen sağlayıcı siteniz için vhost girdisinde aşağıdaki satırı olduğundan emin olun lazım: SSLOptions +StdEnvVars. Bu hattı komut (PHP) için ortamda SSL değişkenler eklemek için Apache söyler.