¿Cómo puedo forzar a SSL / https usando .htaccess y la página mod_rewrite específica en PHP?
¿Cómo puedo forzar a SSL / https usando .htaccess y la página mod_rewrite específica en PHP?
Respuestas:
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.
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
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.
function forceHTTPS(){
$httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( count( $_POST )>0 )
die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
if( !headers_sent() ){
header( "Status: 301 Moved Permanently" );
header( "Location: $httpsURL" );
exit();
}else{
die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
}
}
}
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 la forceHTTPS()
función.
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.
RewriteEngine on
# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
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.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Esto redirigirá sus solicitudes http que no sean www y www a la versión www de https.
Otra solución (Apache 2.4 *)
RewriteEngine on
RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Esto no funciona en versiones inferiores de apache ya que la variable% {REQUEST_SCHEME} se agregó a mod-rewrite desde 2.4.
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:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
Simple y fácil, solo agregue lo siguiente
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Uno simple:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
reemplace su url con example.com
solo por forzar SSL con Apache .htaccess puedes usar
SSLOptions +StrictRequire
SSLRequireSSL
para redirigir la respuesta anterior es correcta
pruebe este código, funcionará para todas las versiones de URL como
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]