¿Cómo puedo forzar a SSL / https usando .htaccess y la página mod_rewrite específica en PHP?
Para Apache, puede usar mod_ssl
para forzar SSL con SSLRequireSSL Directive
:
Esta directiva prohíbe el acceso a menos que HTTP sobre SSL (es decir, HTTPS) esté habilitado para la conexión actual. Esto es muy útil dentro del host virtual o directorios habilitados para SSL para defenderse contra errores de configuración que exponen cosas que deberían protegerse. Cuando esta directiva está presente, se rechazan todas las solicitudes que no utilizan SSL.
Sin embargo, esto no redirigirá a https. Para redirigir, intente lo siguiente con mod_rewrite
su archivo .htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
o cualquiera de los diversos enfoques dados en
También puede resolver esto desde PHP en caso de que su proveedor haya deshabilitado .htaccess (lo cual es poco probable ya que lo solicitó, pero de todos modos)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
%{HTTP:X-Forwarded-Proto}
o%{HTTP:X-Real-Port}
variables para comprobar si SSL está activada.RewriteRule <input-pattern> <output-url>
. Por lo tanto, el espacio debe estar allí, y el sencillo^
solo dice "coincide con todas las URL de entrada".Encontré una
mod_rewrite
solución que funciona bien para servidores con y sin proxy.Si está utilizando CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift o cualquier otra solución Cloud / PaaS y está experimentando bucles de redireccionamiento con redireccionamientos HTTPS normales, intente con el siguiente fragmento.
fuente
Solución PHP
Tomando prestado directamente de la respuesta muy completa de Gordon, noto que su pregunta menciona que es específica de la página al forzar conexiones HTTPS / SSL.
Luego, tan cerca de la parte superior de estas páginas que desea forzar a conectarse a través de PHP, puede
require()
crear un archivo centralizado que contenga esta (y cualquier otra) función personalizada, y luego simplemente ejecutar laforceHTTPS()
función.Solución HTACCESS / mod_rewrite
No he implementado este tipo de solución personalmente (he tendido a usar la solución PHP, como la anterior, por su simplicidad), pero lo siguiente puede ser, al menos, un buen comienzo.
fuente
RewriteCond %{REQUEST_METHOD} !^POST$
?RewriteCond %{REQUEST_METHOD} !^POST$
debe evitar que los envíos POST se vean afectados por estas redirecciones.Solución basada en reescritura mod:
El uso del siguiente código en htaccess reenvía automáticamente todas las solicitudes http a https.
Esto redirigirá sus solicitudes http que no sean www y www a la versión www de https.
Otra solución (Apache 2.4 *)
Esto no funciona en versiones inferiores de apache ya que la variable% {REQUEST_SCHEME} se agregó a mod-rewrite desde 2.4.
fuente
Solo me gustaría señalar que Apache tiene las peores reglas de herencia cuando se usan múltiples archivos .htaccess en profundidades de directorio. Dos escollos clave:
RewriteOptions InheritDownBefore
directiva (o similar) para cambiar esto. (ver pregunta)Esto significa que la solución global sugerido en la Wiki Apache hace no funcionan si se utiliza cualquier otro archivo .htaccess en subdirectorios. Escribí una versión modificada que hace:
fuente
Simple y fácil, solo agregue lo siguiente
fuente
Este código me funciona
fuente
Uno simple:
reemplace su url con example.com
fuente
solo por forzar SSL con Apache .htaccess puedes usar
para redirigir la respuesta anterior es correcta
fuente
pruebe este código, funcionará para todas las versiones de URL como
http://www.website.com
fuente