php - redirecciona - Forzar SSL/https usando.htaccess y mod_rewrite
redireccionar http a https php (10)
¿Cómo puedo forzar a SSL / https utilizando .htaccess y mod_rewrite página específica en PHP.
Solución PHP
Tomando prestado directamente de la respuesta muy completa de Gordon, observo que su pregunta menciona ser específica de la página para 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 para conectarse a través de PHP, puede require()
un archivo centralizado que contenga esta (y cualquier otra) función personalizada, y luego simplemente ejecute la función forceHTTPS()
.
Solución HTACCESS / mod_rewrite
No he implementado este tipo de solución personalmente (he tendido a usar la solución PHP, como la que se muestra arriba, 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]
Encontré una solución mod_rewrite
que funciona bien para servidores con proxy 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 redirecciones HTTPS normales, pruebe el siguiente fragmento de código.
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]
Este código me funciona
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Simple y fácil, solo agregue lo siguiente
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Solo me gustaría señalar que Apache tiene las peores reglas de herencia cuando se usan varios archivos .htaccess en las profundidades de los directorios. Dos escollos clave:
- Solo las reglas contenidas en el archivo .htaccess más profundo se realizarán de forma predeterminada. Debe especificar la directiva
RewriteOptions InheritDownBefore
(o similar) para cambiar esto. (ver pregunta) - El patrón se aplica a la ruta del archivo relativa al subdirectorio y no al directorio superior que contiene el archivo .htaccess con la regla dada. (ver discusión)
Esto significa que la solución global sugerida en el Wiki de Apache no funciona si utiliza cualquier otro archivo .htaccess en los 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/
Solución basada en mod-reescritura:
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 redireccionará sus solicitudes http y www no-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 las versiones inferiores de apache, ya que la variable% {REQUEST_SCHEME} se agregó a la reescritura de mods desde 2.4.
Uno simple:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www/.example/.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
reemplaza tu url con example.com
para solo forzar SSL con Apache .htaccess puede usar
SSLOptions +StrictRequire
SSLRequireSSL
Para redirigir la respuesta anterior es correcta.
prueba este código, funcionará para todas las versiones de URL como
- website.com
- www.website.com
- http://website.com
RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC] RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
Para Apache, puede usar mod_ssl
para forzar SSL con la 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 habilitado para SSL o directorios para defenderse contra errores de configuración que exponen cosas que deberían estar protegidas. Cuando esta directiva está presente, se rechazan todas las solicitudes que no utilizan SSL.
Esto no hará una redirección a https sin embargo. Para redirigir, intente lo siguiente con mod_rewrite
en 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 desactivado .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();
}
}