Htaccess : forcer HTTPS sauf pour une url
... / Htaccess : forcer HTTPS s...
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
question

Htaccess : forcer HTTPS sauf pour une url

Par
AnthonyD1
Créé le 2018-06-13 16:47:29 (edited on 2024-09-04 12:20:21) dans Hébergement Web-old

Salut à tous,

Sur la plateforme dont je m'occupe nous devons discuter avec des imprimantes (via JS). Celles-ci ne supportent pas le protocole HTTPS. Ainsi, je souhaite passer par le protocole HTTP sur une seule des urls de la plateforme.

J'ai donc mis en place un fichier .htaccess qui permet de forcer le HTTPS pour toutes les pages sauf les urls de type http://mondomain.com/ws/070815yU7HrioUQQ97/default-version/epos/*

Voici le fichier .htaccess :
Options +FollowSymlinks

DirectoryIndex routes.php
RewriteEngine on

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !/epos(.*)
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(fids|epos|monitor|dashboard|invitations) routes.php [QSA,L]


RewriteRule ^home$ connexion.php [L]
RewriteRule ^connexion(.*)$ connexion$1 [L]
RewriteRule ^Documents(.*)$ Documents$1 [L]

Du coup :
- pour toutes les urls http on passe bien en https
- pour les urls de type http://mondomain.com/ws/070815yU7HrioUQQ97/default-version/epos/* l'url est transformée en : http://mondomain.com/ws/070815yU7HrioUQQ97/default-version/routes.php ce qui lance le script route.php.

L'objectif est le suivant : obtenir une url http://mondomain.com/ws/070815yU7HrioUQQ97/default-version/epos/* et que ce soit le script routes.php qui soit lancé (il s'agit du router).

Merci d'avance.


15 réponses ( Latest reply on 2018-06-16 06:30:28 Par
CM63
)

Personne n'a une idée ?

Bonjour,

Je ne maîtrise pas cette syntaxe, j'ai toujours du mal, mais je te donne juste une indiction: le "[L]" signifie last (dernier), peut-être qu'en ne le mettant pas , quelque part, ça pourrait marcher. Mais bon ce n'est pas très bon comme méthode , genre "et si on fait ça, qu'est-ce que ça fait?", mais fais juste 2 ou 3 essais.

ha... psq dans la doc je vois : Considère la chaîne_de_test comme un chemin et vérifie son existence et si elle est un lien symbolique. On peut aussi utiliser la convention bash -L ou -h lorsqu'il y a risque de confusion avec les tests -lt ou -le.

Du coup je t'avoue que je ne sais pas se que ca veut vraiment dire

En fait il n'y a pas vraiment de question..

Sinon je crois que ça a été vu par le passé mais je n'arrive pas à retrouver le sujet.

Je m’en suis sûrement mal exprimé :/
Je savais que ça n’allais pas être facile à expliquer ^^

La question est la suivante : comment est ce que j’en leux faire pour forcer le https sur toutes les pages, sauf sur celles */épos/*

Et du coup, pourquoi lorsque je mets en place ce fichier htaccess ci dessus, ça me renvoie vers routes.php ?

Merci pour vos reponses


RewriteCond %{REQUEST_URI} !/epos(.*)

J'utilise cela pour ma part :
RewriteCond %{REQUEST_URI} !^/ws/070815yU7HrioUQQ97/default-version/epos/

ou peut être simplement
RewriteCond %{REQUEST_URI} !/epos/


RewriteCond %{REQUEST_URI} !^/ws/070815yU7HrioUQQ97/default-version/epos/


Je viens de faire le test et ca me redirige vers ws/070815yU7HrioUQQ97/default-version/routes.php :/


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(fids|epos|monitor|dashboard|invitations) routes.php [QSA,L]

Vous n'auriez pas un problème dans le chemin que vous appelez ?
Car en gros, si vous appelez un fichier ou un dossier qui n'existe pas, ça renvoie vers routes.php, mais on ne sait pas trop à quel niveau du chemin

Votre logique ne va pas dans ce dernier bloc.
^ veut dire qui commence par
votre url ne commence pas par epos

Décomposez plus simplement pour tester :
RewriteCond %{REQUEST_URI} !^/ws/070815yU7HrioUQQ97/default-version/epos/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /ws/070815yU7HrioUQQ97/default-version/epos/routes.php [L]

Merci pour tes réponses !!
Petites précisions supplémentaires :

* le script que je désire appeler est situé dans le répertoire ws/070815yU7HrioUQQ97/default-version/ qui existe bien
- le fichier .htaccess est situé dans ce même répertoire
- le /epos/test correspond à une route (qui doit être interprété dans le script situé dans routes.php), donc le fichier n'existe pas mais il faut que ce soit le script routes.php qui soit lancé


Vous n'auriez pas un problème dans le chemin que vous appelez ?


Nan parce que lorsque je commente la partie redirection HTTPS, l'url fonctionne correctement.


Décomposez plus simplement pour tester :

Ca me renvoie toujours vers routes.php

Alors, je n'ai pas compris ce que vous vouliez faire.
Sur le premier post, il faut bien rediriger vers /routes.php

Je crois qu'il faut repartir de 0 (au moins pour moi LOL), histoire d'oublier tout ce qui a été dit avant.
Vous pouvez refaire votre demande, avec des exemples précis ?
1/ le comportement normal du site
2/ le comportement spécial pour votre imprimante

^^ oauip je me doutais que ce serait difficile à expliquer.
Alors dans un premier temps voici l'arborescence des répertoires :
_www > preprod > ws > 070815yU7HrioUQQ97 > default-version_

Et voici la situation :
Pour accéder à la plateforme j'utilise cette url : https://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/[une_route]
où [une_route] correspond à la page à afficher et le sous répertorie racine du sous domaine preprod est _www > preprod

Dans le répertoire ws/070815yU7HrioUQQ97/default-version il y a un fichier nommé routes.php, qui joue le rôle de router. Ainsi, chaque requête HTTP doivent exécuter ce script.

J'ai donc placé un fichier .htaccess dans le répertorie ws/070815yU7HrioUQQ97/default-version avec de l'url rewriting :


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(fids|epos|monitor|dashboard|invitations) routes.php [QSA,L]


Exemple : une requête vers https://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/fids exécute le script routes.php pour afficher la page correspondant aux programmes de fidélités...

Jusqu'à présent je voulais forcer toutes les requêtes en HTTPS. Du coup, j'ai ajouté dans le fichier .htaccess :

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Et ça fonctionne bien, exemple : une requête vers http://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/fids, me renvoie vers https://preprod.mondomaine.com/.../fids

Aujourd'hui j'utilise des imprimantes Epson. Pour communiquer avec elles, il faut passer par du js. Malheureusement, le SSL n'est pas supporté :/

De plus, lorsqu'en js on effectue une requête depuis une page HTTPS vers HTTP, le navigateur bloque (notamment sous iOS). Exemple : je suis sur la page https://preprod.mondomaine.com/.../fids et j'ouvre une connexion en js vers http://192.168.0.1/... le navigateur m'envoie bouler.

Pour palier à cela j'ai donc décidé de créer une page qui serai accessible uniquement depuis HTTP et qui exécuterai le script JS pour lancer les impressions. Cette page à pour url : http://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/epos/test

Pour qu'elle reste sur le protocole http il faut donc ajouter une condition d'exclusion sur la partie "on force le HTTPS" dans le fichier htaccess.

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !/epos(.*)
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Et c'est la où ça bloque !

Voici ce qu'il se passe :

* Quand je vais sur n'importe quelle page **http**://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/[une_route] il me redirige vers **https**://preprod.mondomaine.com/.../[une_route] => comportement OK

* Quand je vais vers **http**://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/epos/test il me redirige vers **https**://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/routes.php => NON OK

Comportement voulu :
* Quand je vais vers **http**://preprod.mondomaine.com/ws/070815yU7HrioUQQ97/default-version/epos/test il reste sur cette url et il execute le script routes.php comme pour les autres url

Bon, ça n'est pas super clair dans ma tête !


RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !/epos(.*)
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Ok, ça, ça redirige tout ce qui n'est pas /epos, sur le bon chemin.
Il reste donc à rediriger ce qui est /epos, sur le bon chemin non ?

RewriteCond %{REQUEST_URI} /epos(.*)
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Ok, ça, ça redirige tout ce qui n'est pas /epos, sur le bon chemin.
Il reste donc à rediriger ce qui est /epos, sur le bon chemin non ?

RewriteCond %{REQUEST_URI} /epos(.*)
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Effectivement j'ai essayé ça, mais sans succès : impossible de charger la page. J'ai l'impression qu'il fait une boucle infinie du coup

Bonjour,

Je ne peux pas trop vous dire comment faire car je en maîtrise pas trop cette syntaxe, mais en revanche je peux vous donner un conseil sur la marche à suivre:
- mettre la règle de réécriture de l'url utilisée pour les imprimantes en dur, sans aucune wild-card (pppplus t'expliquera ce que c'est qu'une wild-card), et ne pas mettre [L] pour cette règle,
- mettre ensuite la règle de réécriture générale avec les wild-cards, et mettre le [L] à la fin de cette règle.

Dans la première règle on va mettre http, alors que dans la deuxième on mettra https. En gros il faudrait que lorsque la première règle a marché, il (la machine) n'essaie pas d’exécuter la deuxième, qu'il n’exécute la deuxième que si la première n'a pas marché: d'où l'absence ou la présence du [L] (c'est là que je ne maîtrise pas la syntaxe, mais c'est le principe).

Voila, j'espère que cela pourra vous aider.