2009-07-10 16 views
19

Tenemos un sitio de compras que alojamos en un host compartido (Mediatemple Gridserver). Algunas partes del sitio deben usar HTTPS (pago, etc.), pero el resto debe estar usando HTTP.Cambiar correctamente entre HTTP y HTTPS utilizando .htaccess

¿Alguien sabe cómo siempre podemos forzar el uso correcto de HTTP/HTTPS para determinadas URL? Lo hemos tenido funcionando en varios estados, pero no podemos obtener una solicitud para una página que debe estar en HTTP, pero se solicita con HTTPS para volver a cambiar correctamente.

He echado un vistazo alrededor de SO, pero no he podido encontrar una respuesta adecuada para esto.

+0

¿Tiene que estar con .htaccess? ¿Qué idioma es el sitio usando? – random

+0

¿Qué está tratando de prevenir el https? –

Respuesta

33

que usar algo similar a esto para mi carpeta admin en WordPress:

#redirect all https traffic to http, unless it is pointed at /checkout 
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/checkout/?.*$ 
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L] 

La parte RewriteCond %{HTTPS} on puede no funcionar para todos los servidores web. Mi servidor web requiere RewriteCond %{HTTP:X-Forwarded-SSL} on, por ejemplo.

Si desea forzar la inversa, intente:

#redirect all http traffic to https, if it is pointed at /checkout 
RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/checkout/?.*$ 
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L] 

Si quieres algunas formas alternativas para hacerlo, echa un vistazo a askapache.

+0

he comprobado el código en mi servidor, utilizando los dos bloques enumerados anteriormente, y funciona bien sin bucles de redirección. –

+0

+1. Gran respuesta. El 'RewriteCond% {HTTP: X-Forwarded-SSL} on' era necesario en mi caso porque estoy usando la nube de RackSpace sitios. –

+2

[@ wilmoore's] (http://stackoverflow.com/questions/1108706/correctly-switching-between-http-and-https-using-htaccess/#9917579) sugerencia para utilizar la adición de '% {SERVER_NAME}' será útil – antitoxic

0

creo que debe ser:

RewriteCond %{HTTPS} =on 
^/checkout(.*) http://shoppingsite.com/checkout$1 [R] 

Consulte la documentación mod_rewrite.

13

Esto debería funcionar en casi todos los escenarios y debe trabajar en su host real o .htaccess:

RewriteEngine on 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

(no se olvide de la barra antes de% {} REQUEST_URI ya que esto puede permitir pasar un número de puerto, el cual es peligroso)

+1

Su respuesta, aunque es elegante, tiene un pequeño error. La última línea debe tener una barra inclinada (/) después de SERVER_NAME, o www.test.com/dir reenviados a http: //www.test.comdir – Juhani

+0

@Juhani Gracias por su comentario. En realidad,% 1 se asigna a la variable de entorno {REQUEST_URI}, que es relativa a la raíz. En otras palabras, si solicitó http://example.com/123, entonces REQUEST_URI === '/ 123'; por lo tanto, otra barra sería superfluo. Todavía funcionaría porque en la mayoría de las configuraciones modernas, apache quitará la barra adicional. A menos que desee que apache haga más trabajo, no necesita la barra. Una vez dicho esto, actualicé mi respuesta original para usar% {REQUEST_URI} en lugar de% 1, ya que es más revelador de la intención. –

+0

@wilmoore: eso es correcto cuando las opciones se colocan en el archivo de configuración del servidor, ya que el motor de reescritura puede [enganchar] (http://httpd.apache.org/docs/2.4/rewrite/tech.html) URL-to- filename-translation. Sin embargo, cuando se coloca en un archivo de configuración [por directorio] (http://httpd.apache.org/docs/2.4/rewrite/intro.html#htaccess), el URI ya se ha correlacionado con un nombre de ruta cuando el reescriba los pasos del motor. El motor de reescritura maneja esto eliminando el prefijo del directorio, que termina eliminando el '/' inicial y haciendo coincidir el resultado. – outis

1

Como se detalla en this answer, arregle su aplicación para usar los enlaces https:// cuando sea necesario. No confíe en las redirecciones automáticas, esto podría llevarlo a una falsa sensación de seguridad si no ha hecho que sus enlaces/formularios servidos sobre https:// vayan también a las URL https://. El uso de mod_rewrite hace que sea más difícil detectar dichos errores (que también pueden ser vulnerabilidades).

5
RewriteEngine on 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

Tuve algún problema para estar detrás de un loadballancer. Así como lo arreglé

+0

¿Eso realmente funciona? Me lanzó a un bucle de redirección. Si tiene loadbalancer, el HTTPS no se configurará y se cumplirá el primer RewriteCond. Si no lo haces, se cumplirá el segundo RewriteCond. Por lo tanto, cada vez serás redirigido de nuevo. Lo tengo trabajando usando (otra respuesta) [http://stackoverflow.com/a/26623196/2182900] que es básicamente lo mismo, pero sin el '[OR]' - solo redirigir si HTTPS está desactivado y el HTTP : X-Forwarded-Proto no es https. –

+0

Esto funciona perfectamente para mí. ¡Gracias! –

1

Para mí funcionó esto (lo usé para el sitio de wordpress y para redirigir a HTTPS). Hay que añadir las líneas de condición y de reglas justo detrás de las líneas RewriteEngine y RewriteBase:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

# I added these two lines for redirect to HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] 
# (end of custom modifications) 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
# END WordPress` 

Tenga una mirada a condicionar RewriteCond %{HTTP:X-Forwarded-Proto} !https - sólo esto trabajó para mi servidor de hosting. (I intentado RewriteCond %{SERVER_PORT} !^443$ o RewriteCond %{HTTPS} off también, pero sin éxito.