2010-07-22 16 views
16

J'ai un projet client où j'ai besoin de forcer HTTPS pour un certain dossier et de forcer HTTP pour tous les autres. Je peux réussir HTTPS pour le dossier que je désire, mais tous les liens vers le reste du site finissent par HTTPS. Je voudrais avoir une règle qui force les demandes de n'importe quoi 'non' dans le dossier sécurisé à être forcé à HTTP. Voici ce que j'ai jusqu'à présent:Forcer HTTPS sur certaines URL et forcer HTTP pour tous les autres

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 que je dois forcer HTTPS pour.

Des idées?

Mise à jour: J'ai aussi 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 des demandes de/mon être forcé via HTTPS, ils résolvent maintenant juste http://www.example.com/index.php/my

:

Répondre

16

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 suite à la redirection initiale. En utilisant ce que vous avez actuellement, vous devez également conditionner les redirections pour vous assurer qu'elles ne seront pas appliquées après la réécriture à /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 
+0

Merci, m'a sauvé beaucoup de temps! FWIW, dans Wordpress, le Wordpress htaccess de base IfModule supprime déjà index.php des URLs. – Jason

0

inverser seulement les conditions:

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

Salut ya, merci pour la réponse rapide. J'ai essayé cela mais je ne savais pas où le placer dans le flux de mes règles existantes, des pointeurs? Si je le place au-dessus de la règle "Force HTTPS" existante, cela empêche le fonctionnement de "Force HTTPS" et empêche également l'exécution de la règle finale qui réécrit index.php. :? –

+0

@Nathan Pitman: Non, car ils ont des conditions de correspondance différentes, ils ne devraient pas interagir. – Gumbo

+0

ok, j'ai essayé ce que vous avez suggéré (voir la mise à jour de mon message original) mais cela n'a pas fonctionné. Je peux voir que ça «devrait» mais je pense que j'ai peut-être les règles dans le mauvais ordre ou certaines règles causent la réécriture à se terminer avant d'autres conditions et règles peuvent être évaluées ...:/ –

1

C'est quelque chose qui fonctionne à partir d'un ancien site client et 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 panier avec mon peut-être

4

Essayez le suivant, devrait travailler 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] 
Questions connexes