none
Url-Rewrite geht nicht RRS feed

  • Frage

  • Hallo allerseits,

    schaffe es nicht folgende Problemstellung mit Url-Rewriter zu bewerkställigen und hoffe das ihr mir da weiter helfen könnt.

    Nach dem Registrieren wird eine Nachricht geschickt in der auch LinkButtons in der Nachricht vorhanden sind wie Bsp: Anmelden, Impressum und AGB.
    Klickt der User in der Nachricht auf einen dieser Links wird bsp:

    http://domain.com/Home.aspx?q=7s0+345/y2=3kf8...         // 45 stellig und immer andere Zeichenfolge
    http://domain.com/Home.aspx?lgn=1                                                       // Immer gleich (lgn=1)
    http://domain.com/Home.aspx?imp=1                                                      // Immer gleich (imp=1)
    http://domain.com/Home.aspx?agb=1                                                      // Immer gleich (agb=1)

    aufgerufen.
    Es gibt nur die vier Fälle.
    Bei den letzten drei ist der QueryString immer gleich jedoch beim ersten (45 stelligen) ist es immer ein anderer String.

    Mein Ziel:
    Ganz gleich was der User ausählt bzw. klickt es soll immer in der Adressleiste des Browsers nach dem verarbeiten
    http://domain.com/Home.aspx
    oder
    http://domain.com
    stehen und nicht
    http://domain.com/Home.aspx?lgn=1

    Bsp:
        -) User wählt Anmelden aus
        -) Es wird "http://domain.com/Home.aspx?lgn=1" ausgerufen.
        -) Die entsprechende Seite wird mittels jQuery/ajax/Webservice geladen und angezeigt
        -) Browser-Url ändern


    Ich verwende sehr wenige PostBack's bzw. Response.Redirect's

    Meine Versuche:
    1.) global.asax: BeginRequest-Method

    // sowohl mit RewritePath als auch mit MapPath
    
                string fullOrigionalpath = Request.Url.ToString();
                if (fullOrigionalpath.Contains("/Home.aspx?lgn="))
                { Context.RewritePath("~/Home.aspx/lgn"); }
                else if (fullOrigionalpath.Contains("/Home.aspx?agb="))
                { Context.RewritePath("~/Home.aspx/agb"); }
    ...
    if (fullOrigionalpath.Contains("/Home.aspx?lgn=")) { Context.Request.MapPath("~/Home.aspx/", fullOrigionalpath, false); } else if (fullOrigionalpath.Contains("/Home.aspx?agb=")) { Context.Request.MapPath("~/Home.aspx/", fullOrigionalPath, false); }

    2.) web.config

        <urlMappings>
          <add url="~/"      mappedUrl="~/Home.aspx?q=*" />
          <add url="~/"      mappedUrl="~/Home.aspx?lgn=1" />
          <add url="~/"      mappedUrl="~/Home.aspx?imp=1" />
          <add url="~/"      mappedUrl="~/Home.aspx?agb=1" />
        </urlMappings>

    3.) Url Rewrite-Modul auf IIS Server
    Hier habe ich es mit eine Blank-Rule, FriedlyUser-Url und mit der Rewrite Map versucht.
    In allen Fällen hatt es nicht geklappt.

    Und jetzt bin ich schon fast am Ende.
    Ich wäre daher sehr dankbar wenn mir das jemand erklären könnte was ich falsch mach und vorallem wie ich zur meiner Lösung komme.

    Ganz Wichtig:
    Die Url mus schlimmsten Fall so
    http://domain.com/Home.aspx
    aussehen und im besten Fall so
    http://domain.com
    ganz gleich was davor geklickt bzw. ausgewählt wurde

    Lg
    WaZZ




    • Bearbeitet WaZZkeSS Mittwoch, 22. Juli 2015 06:05
    Mittwoch, 22. Juli 2015 06:02

Antworten

  • Hi,

    das, was Du da versuchst, ist nicht ohne weiteres möglich.

    Woher soll der Server wissen, welche Adresse gemeint ist, wenn http://domain.com/ aufgerufen wurde. Du musst daher entweder für jede Zieladresse eine eigene Quelladresse angeben. Also bspw:

    <urlMappings>
        <add url="~/"         mappedUrl="~/Home.aspx?q=*" />
        <add url="~/lgn"      mappedUrl="~/Home.aspx?lgn=1" />
        <add url="~/imp"      mappedUrl="~/Home.aspx?imp=1" />
        <add url="~/agb"      mappedUrl="~/Home.aspx?agb=1" />
    </urlMappings>

    oder dafür sorgen, dass der Client die benötigten Informationen erhält, um die Daten dann anschließend per Javascript auslesen und abrufen zu können.

    Da es allerdings keinen wirklichen Grund dafür gibt, alles mit einer einzigen Adresse ohne Parameter machen zu wollen, schlage ich erstmal den o.g. Weg vor.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 22. Juli 2015 06:26
    Moderator
  • Hi,

    um den QueryString abzufragen, musst Du etwas anders vorgehen:

    <rule name="QueryString" enabled="true" stopProcessing="true">
        <match url="^Home.aspx" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="q=[a-zA-Z0-9+-\^\[\]\{\}@|~\ #*'_!\/)(]{44}$" />
        </conditions>
        <action type="Redirect" url="/" appendQueryString="false" />
    </rule>
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert WaZZkeSS Dienstag, 28. Juli 2015 05:06
    Mittwoch, 22. Juli 2015 12:27
    Moderator

Alle Antworten

  • Hi,

    das, was Du da versuchst, ist nicht ohne weiteres möglich.

    Woher soll der Server wissen, welche Adresse gemeint ist, wenn http://domain.com/ aufgerufen wurde. Du musst daher entweder für jede Zieladresse eine eigene Quelladresse angeben. Also bspw:

    <urlMappings>
        <add url="~/"         mappedUrl="~/Home.aspx?q=*" />
        <add url="~/lgn"      mappedUrl="~/Home.aspx?lgn=1" />
        <add url="~/imp"      mappedUrl="~/Home.aspx?imp=1" />
        <add url="~/agb"      mappedUrl="~/Home.aspx?agb=1" />
    </urlMappings>

    oder dafür sorgen, dass der Client die benötigten Informationen erhält, um die Daten dann anschließend per Javascript auslesen und abrufen zu können.

    Da es allerdings keinen wirklichen Grund dafür gibt, alles mit einer einzigen Adresse ohne Parameter machen zu wollen, schlage ich erstmal den o.g. Weg vor.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 22. Juli 2015 06:26
    Moderator
  • Hallo und danke für deine prompte Antwort,
    Habe zwar nicht alle meine Versuchvarianten gepostet aber das hatte ich auch schon getestet
    <urlMappings>
        <add url="~/"         mappedUrl="~/Home.aspx?q=*" />
        <add url="~/lgn"      mappedUrl="~/Home.aspx?lgn=1" />
        <add url="~/imp"      mappedUrl="~/Home.aspx?imp=1" />
        <add url="~/agb"      mappedUrl="~/Home.aspx?agb=1" />
    </urlMappings>
    
    // oder
    
    <urlMappings>
        <add url="~/Home.aspx/"         mappedUrl="~/Home.aspx?q=*" />
        <add url="~/Home.aspx/lgn"      mappedUrl="~/Home.aspx?lgn=1" />
        <add url="~/Home.aspx/imp"      mappedUrl="~/Home.aspx?imp=1" />
        <add url="~/Home.aspx/agb"      mappedUrl="~/Home.aspx?agb=1" />
    </urlMappings>
    Was mir aufgefallen ist und leider vergessen habe zu erwähnen, das nach dem Befehl in der global.asax
    Context.RewritePath("~/Home.aspx/imp");
    
    // oder 
    
    Context.Request.MapPath("~/Home.aspx/", fullOrigionalpath, false);
    der Request.Path geändert wird jedoch nicht Request.RawUrl nicht.
    Mittwoch, 22. Juli 2015 06:42
  • So langsam hab ichs.

    Brächte nur einen Reg-Ex für Bsp:
    q=SE4AEO4WcGpCAhKzUZ+2i2O9D/DPLMQ5ElO3Y9IaQF8=

    -) Für das "q=" ---> ^q=

    -) Rest ---> 45 stellig,
    a-z, A-Z, 0-9
    und folgende sonderzeichen
    -+^][}{@|~ #*`_!/)(

    Ich weiß Leerzeichen usw. gibts in der Url nicht jedoch hätte ich trotzdem gern den Syntax dafür.
    Besten Dank im voraus.
    Mittwoch, 22. Juli 2015 08:08
  • ... besten Dank hat sich erledigt.
    Markiere trotzdem deine Anwort als richtig.

    Lg
    WaZZ


    • Bearbeitet WaZZkeSS Mittwoch, 22. Juli 2015 08:43
    Mittwoch, 22. Juli 2015 08:42
  • Hi,

    welchen RegEx Ausdruck (oder eine andere Lösung) hast Du denn nun verwendet?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 22. Juli 2015 08:59
    Moderator
  • Nun für die letzten drei war es einfach und bei dem letzteren bin ich noch nicht so ganz zufrieden

    <rewrite>
          <rules>
              <rule name="lDvm" stopProcessing="true">
                  <match url="^lgn=[1-1]" />
                  <action type="Redirect" url="/" />
              </rule>
              <rule name="aDvm" stopProcessing="true">
                  <match url="^agb=[1-1]" />
                  <action type="Redirect" url="/" />
              </rule>
              <rule name="iDvm" stopProcessing="true">
                  <match url="^imp=[1-1]" />
                  <action type="Redirect" url="/" />
              </rule>
              <rule name="bDvm" stopProcessing="true">
                  <match url="^q=[a-zA-Z0-9+-\^\[\]\{\}@|~\ #*'_!\/)(]{44}$" />
                  <action type="Redirect" url="/" />
              </rule>
          </rules>
      </rewrite>
    Leider wird die Url nicht wie bei den ersten drei überschrieben aber zumindest mal keinen Fehler beim testen vom Pattern.

    Probier derzeit irgendwie mit dem "?"
    <match url="^[?]q=...
    damit ich'smittels QueryString abfangen kann. Leider wird in der glabal.asax
    BeginRequest und AcquireRequestState Event nicht ausgelöst
    wenn ich den RegEx so angebe
    <match url="^q=...
    Ist zwar jetzt unverschähmt da ich zuerst schon sagte das Problem sei gelöst, aber hättest du da eine Idee warum das bei den drei funktioniert und beim letzteren nicht.
    Das einzige woran Sie sich unterscheiden sind die Zeichenlänge nach dem "=" Zeichen und die zusätzlichen Sonderzeichen.
    Habe beim Pattern-Tester im IIS die Zeichenlänge mit verschiedenen Sonderzeichen probiert und hat zumindest keine Fehler angezeigt.

    Veilleicht sehe ich lauter Bäume den Wald nicht mehr.

    Danke im voraus und Lg
    WaZZ



    • Bearbeitet WaZZkeSS Mittwoch, 22. Juli 2015 10:52
    Mittwoch, 22. Juli 2015 10:48
  • Hi,

    um den QueryString abzufragen, musst Du etwas anders vorgehen:

    <rule name="QueryString" enabled="true" stopProcessing="true">
        <match url="^Home.aspx" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="q=[a-zA-Z0-9+-\^\[\]\{\}@|~\ #*'_!\/)(]{44}$" />
        </conditions>
        <action type="Redirect" url="/" appendQueryString="false" />
    </rule>
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert WaZZkeSS Dienstag, 28. Juli 2015 05:06
    Mittwoch, 22. Juli 2015 12:27
    Moderator
  • Hy

    leider kann erst am Sonntag testen und dir bescheid.
    Sry für die Verspätung.


    Lg
    WaZZ

    Freitag, 24. Juli 2015 07:22
  • Hi,

    funktioniert es wie ichs haben wollte.
    Danke für dein Sample und

    Lg
    WaZZkeSS

    Dienstag, 28. Juli 2015 05:06