8
votes

Regex pour correspondre à toutes les URL HTTPS sauf un certain chemin

J'ai besoin d'une regex qui correspondra à toutes les URL HTTPS sauf pour un certain chemin.

par exemple par exemple

correspondre

https://www.domain.com/blog https://www.domain.com

ne correspond pas

htttps://www.domain.com/forms/ *

C'est ce que j'ai jusqu'à présent: xxx

mais cela ne fonctionne pas


6 commentaires

L'URL correspondante a été posée cent fois. Mais oublions que chercher un duplicata et s'il vous plaît dites-nous quelle saveur vous utilisez?


Bonjour Hamza, j'ai essayé de trouver une regex qui correspond à mon exigence mais que je ne pouvais en avoir. J'utilise le module de réécriture URL IIS. La règle est de correspondre à tous sauf, qui est le bit délicat. Ce serait génial si vous pouviez aider, cela me gagnerait quelques heures de sommeil. Cela me fait fermer mais pas assez près Stackoverflow.com/Questtions/2277340/...


Que devrait empêcher le match exactement, quelles sont les règles d'une URL non valide?


Je veux attraper tout le trafic https et le rediriger à http à moins que l'URL HTTPS ne soit domaine.com/forms "/a > *


Il semble y avoir une erreur dans votre état, votre modèle dit "http?" au lieu de "https". Est-ce que la question peut-être?


Merci à tout le monde pour les réponses, apprécie vraiment l'aide


4 Réponses :


4
votes

Je suis venu avec le motif suivant: ^ https: // [^ /] + (/ (?! Formulaire / | Formulaire $). *)? $

Explication:

  • ^ : Match Begin of String
  • https: // : correspondance https: //
  • [^ /] + : correspond à quoi que ce soit, sauf avant, slash antérieure une ou plusieurs fois
  • (: Démarrer le groupe correspondant 1
    • / : correspondez /
    • (?! : regard négatif
      • formulaire / : Vérifiez s'il n'y a pas de formulaire /
      • | : ou
      • Formulaire $ : Vérifiez s'il n'y a aucun formulaire à la fin de la chaîne
      • ) : fin de lookahead négatif
      • . * : correspond à tout zéro ou plus fois
      • ) : Fin correspondant Groupe 1
      • ? : faire le jeton précédent en option
      • $ : correspondez fin de ligne

8 commentaires

@Sniffer où et comment l'avez-vous testé?


Je l'ai testé en utilisant Expresso et fourni comme entrée l'URL qui n'est pas censée correspondre mais expresso a déclaré qu'elle est valide.


@Sniffer avant de l'afficher, je l'ai également testé. Demo1 Demo2 .


Eh bien, c'est vraiment étrange parce que j'ai testé les autres réponses Regex et cela a fonctionné mais le vôtre n'a pas.


Même si la regex de la question utilise "https?", Je pense que op ne veut pas le? Comportement de la correspondance HTTP aussi, puisqu'il déclare "correspondre à toutes les URL HTTPS" spécifiquement. Peut vouloir supprimer la marque QN là-bas.


@sundar je l'ai intentionnellement placé là-bas depuis qu'il l'avait eu dans son expression.


Désolé mon erreur, il ne devrait être que https


@Burt bien simple, il suffit de supprimer le ? : p



5
votes

Cela vous donne-t-il le comportement que vous recherchez?

https ?: // [^ /] + ($ | / (?! Formulaires) /?.*$)

Après le www.domain.com Bit, il recherche la fin de la chaîne ou pour une barre oblique, puis quelque chose qui n'est pas formulaires . < / p>


0 commentaires

3
votes

Je vois deux problèmes dans le motif publié http: // [^ /] + ($ | / (?! Formulaires) /?.*$) code>

  • Il manque les URL de redirection tels que https://domain.com/forms_instructions code>, car le motif ne parvient pas à correspondre à celles-ci également. p> li>

  • Je pense que vous avez http et https inversé entre le motif et l'URL. Le motif doit avoir https code> et l'URL http code>. p> li> ul>

    Cela fonctionnera peut-être comme vous souhaitez: P>

     <rule name="Redirect from HTTPS to HTTP excluding /forms" enabled="true" stopProcessing="true">
            <match url="^https://[^/]+(/(?!(forms/|forms$)).*)?$" />
            <action type="Redirect" url="http://{HTTP_HOST}{R:1}" redirectType="Permanent" />
        </rule>
    


2 commentaires

Merci Sundar, il ne semble toujours pas fonctionner, je pense que c'est assez proche, tout simplement pas sûr de la raison pour laquelle il ne prendra pas la racine de mon domaine ( domain.com ) et redirige-le à l'équivalent HTTP


@Burt voulez-vous dire cela a fonctionné pour toutes les pages autres que le domaine root.com? Si oui, je serais effectivement surpris, car le {R: 0} dans l'URL de la redirection précédente aurait dû faire foiré les choses si je le comprends correctement. J'ai mis à jour le message avec quelques modifications, veuillez essayer cette version.



5
votes

La manière dont le module de redirection fonctionne, vous devez simplement utiliser:

<rule name="Redirect from HTTPS to HTTP excluding /forms" stopProcessing="true">
    <match url="^forms/?" negate="true" />
    <conditions>
        <add input="{HTTPS}" pattern="^ON$" />
        <add input="{HTTP_HOST}" pattern="^www.example.com$" />
    </conditions>
    <action type="Redirect" url="http://{HTTP_HOST}/{R:0}" />
</rule>


0 commentaires