redireccionar redirecciona htaccess force php .htaccess mod-rewrite ssl https

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
  • http://www.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(); } }