web-dev-qa-db-fra.com

Forcer HTTPS sur certaines URL et forcer HTTP pour toutes les autres

J'ai un projet client où je dois forcer HTTPS pour un certain dossier et forcer HTTP pour tous les autres. Je peux appliquer avec succès HTTPS pour le dossier que je souhaite, mais tous les liens vers le reste du site finissent par être HTTPS. Je voudrais avoir une règle qui force les demandes de "non" dans le dossier sécurisé à être forcées de revenir à HTTP. Voici ce que j'ai jusqu'à présent:

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

"mon" est le nom du dossier pour lequel je dois forcer HTTPS.

Des idées?

Mise à jour: j'ai également essayé:

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

Mais au lieu de demander/d'être forcé via HTTPS, ils se résignent maintenant à http://www.example.com/index.php/my

:?

18
Nathan Pitman

Ah, bien sûr. Le problème réside dans le fait que votre jeu de règles de réécriture sera retraité après sa transformation en index.php après la redirection initiale. En utilisant ce que vous avez actuellement, vous devez en outre conditionner les redirections pour vous assurer qu'elles ne sont pas appliquées après la réécriture dans /index.php/my.

Quelque chose comme ce qui suit devrait faire:

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
16
Tim Stone

Essayez ce qui suit, devrait fonctionner pour vous:

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]
4
user2316701

C'est quelque chose qui fonctionne à partir d'un ancien site Web client et qui pourrait être adaptable à vos besoins:

#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]

Remplacement du panier par mon peut-être

1
connrs

Inversez simplement les conditions:

RewriteCond %{HTTPS} =on
RewriteRule !^my http://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]
0
Gumbo