apache - htaccess - Forzar HTTPS en ciertas URL y forzar HTTP para todas las demás
redirect http to https apache centos 7 (4)
Tengo un proyecto de cliente donde necesito forzar HTTPS para una carpeta determinada y forzar HTTP para todas las demás. Puedo hacer cumplir con éxito HTTPS para la carpeta que deseo, pero luego todos los enlaces al resto del sitio terminan a través de HTTPS. Me gustaría tener una regla que obligue a que las solicitudes de "no" en la carpeta segura se devuelvan a HTTP. Esto es lo que tengo hasta ahora:
RewriteEngine On
RewriteCond $1 !/.(gif|jpe?g|png)$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1
''mi'' es el nombre de la carpeta para la que necesito forzar HTTPS.
¿Algunas ideas?
Actualización: También probé:
RewriteEngine On
RewriteCond $1 !/.(gif|jpe?g|png)$ [NC]
# Force HTTPS for /my
RewriteCond %{HTTPS} !=on
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# Force HTTP for anything which isn''t /my
RewriteCond %{HTTPS} =on
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# Remove index.php from URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1
Pero en lugar de solicitudes de / forzado a través de HTTPS, ahora solo se resuelven en http://www.example.com/index.php/my
:?
Ah, por supuesto. El problema radica en el hecho de que su conjunto de reglas de reescritura se volverá a procesar después de que se transforme a index.php
después de la redirección inicial. Usando lo que tiene actualmente, necesita condicionar adicionalmente las redirecciones para asegurarse de que no se apliquen después de la reescritura en /index.php/my
.
Algo como lo siguiente debería hacer:
RewriteEngine On
RewriteCond $1 !/.(gif|jpe?g|png)$ [NC]
# Force HTTPS for /my
RewriteCond %{HTTPS} !=on
RewriteCond %{THE_REQUEST} ^[A-Z]+/s/my [NC]
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# Force HTTP for anything which isn''t /my
RewriteCond %{HTTPS} =on
RewriteCond %{THE_REQUEST} !^[A-Z]+/s/my [NC]
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# Remove index.php from URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1
Esto es algo que funciona desde un sitio web de un cliente antiguo y podría ser adaptable a sus propósitos:
#If https off and in the cart dir
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{REQUEST_URI} ^/cart/(.*) [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/cart/%1 [R=301,L]
#If https on and not in cart dir
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/cart [NC]
#Above line actually used to read RewriteCond %{REQUEST_URI} !^/cart|media|images|thumbs|css|js [NC]
#to allow js/css/images to be served so there were no mixed ssl messages popping up to visitors
RewriteCond %{REQUEST_FILENAME} !index/.php$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Reemplazo de carro con mi quizás
Prueba lo siguiente, debería funcionar para ti:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/my
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/my
RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Solo invierte las condiciones:
RewriteCond %{HTTPS} =on
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]