web-dev-qa-db-fra.com

Redirection HTTPS, exclure les paramètres de script de l'URL

Mes objectifs:

1. http://example.com/page/index.php -> https://example.com/page/
2. http://example.com/page/ -> https://example.com/page/
3. http://www.example.com/page/ -> https://example.com/page/
4. Any nonexistent file or directory requests -> index.php?&q=$1 for further processing.

Les règles suivantes fonctionnent correctement, mais uniquement après une redirection dans l'URL du navigateur au lieu d'une URL vierge. Par exemple, si je demande:

https://example.com/page/

Je vois

https://example.com/index.php?&q=page/

Comment masquer index.php?&q=page et afficher https://example.com/page/ dans l'URL à la place? Avant d’ajouter la redirection HTTPS, cela fonctionnait bien pour HTTP. J'ai essayé 2 solutions avec le même résultat.

RewriteEngine on
RewriteBase /

Solution 1:

#1 solution:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ [NC]
RewriteRule ^index\.php$ https://%{HTTP_Host}/ [L,NE,R=301]

RewriteCond %{SERVER_PORT} 80 [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)$ [NC]
RewriteRule (.*) https://%1%{REQUEST_URI} [L,NE,R=301]

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?&q=$1 [QSA]

Solution 2:

#2 solution:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ [NC]
RewriteRule ^index\.php$ https://%{HTTP_Host}/ [L,NE,R=301]

RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule (.*) https://%1%{REQUEST_URI} [L,NE,R=301]

RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L,NE,R=301]

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?&q=$1 [QSA]
3
Yury Osipenko

Comment masquer index.php?&q=page et afficher https://example.com/page/ dans l'URL à la place? Avant d’ajouter la redirection HTTPS, cela fonctionnait bien pour HTTP.

Le code que vous avez posté ne devrait pas entraîner une telle "redirection". Et l'ajout de la "redirection HTTPS" ne devrait pas non plus avoir affecté cette situation.

Sauf si ... vous avez initialement ajouté la "redirection HTTPS" à la fin de votre fichier .htaccess, après la réécriture interne sur index.php?&q=$1. Dans ce cas, vous vous attendriez à ce que http://example.com/page/ ou https://www.example.com/page/ ou http://www.example.com/page/ soit demandé de créer une telle redirection externe (par opposition à une réécriture interne ) en https://example.com/index.php?&q=page/. TOUTEFOIS, vous avez déclaré que demander https://example.com/page/ (déjà HTTPS et non-www) entraîne une telle réorientation - ce qui ne se produirait pas dans ce scénario.

Il est toujours possible qu'une précédente redirection (erronée) ait été mise en cache (les 301 le sont de manière permanente par le navigateur) et c'est ce que vous voyez ici. Cependant, vous avez indiqué (dans les commentaires) que le ou les caches (du navigateur? Et de tous les intermédiaires?) Ont été effacés. Donc, cela laisse juste "quelque chose d'autre" (c'est-à-dire quelque chose d'autre externe aux directives que vous avez publiées qui définit un statut HTTP 3xx)?


Notes supplémentaires, qui ne sont pas directement liées à votre problème principal:

  1. http://example.com/page/index.php -> https://example.com/page/

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ [NC]
    RewriteRule ^index\.php$ https://%{HTTP_Host}/ [L,NE,R=301]
    

La condition n ° 1 n'est satisfaite par aucune des directives que vous avez publiées. Les directives que vous avez publiées ci-dessus ne feraient que rediriger une demande de /index.php dans la racine du document, et non de /page/index.php comme vous l'avez indiqué. Pour rediriger /page/index.php, vous devez naturellement inclure le segment de chemin d'accès /page lors de la mise en correspondance de l'URL demandée (et le transmettre à la substitution ). Par exemple:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /page/index\.php\ HTTP/ [NC]
RewriteRule ^(page/)index\.php$ https://%{HTTP_Host}/$1 [L,NE,R=301]

Cependant, je soupçonne qu’une solution "n’importe quel répertoire" serait nécessaire. Dans ce cas, vous pouvez faire quelque chose comme ceci:

RewriteCond %{THE_REQUEST} /index\.php\ HTTP/ [NC]
RewriteRule (.*)index\.php$ https://%{HTTP_Host}/$1 [L,NE,R=301]

RewriteRule (.*) index.php?&q=$1 [QSA]

Vous devriez probablement inclure l'indicateur L (last) sur cette directive, au cas où vous ajouteriez d'autres directives plus tard dans le fichier. (Cela aurait empêché une redirection erronée si vous aviez ajouté la redirection HTTPS à la fin par erreur.)

Et, sauf si vous avez une exigence spécifique, vous devriez réécrire dans index.php?q=$1 (pas de & après le ?). Par exemple:

RewriteRule (.*) index.php?q=$1 [QSA,L]
1
MrWhite