Avatar billede basementjack Nybegynder
11. maj 2005 - 13:00 Der er 28 kommentarer og
1 løsning

Rewrite rules

Jeg vil gerne vide hvordan man laver urlrewrite, når man har en webhost istedet for egen IIS. Kan ikke finde noget om det nogen steder.

Mvh. Jakob J.
Avatar billede snepnet Nybegynder
11. maj 2005 - 23:43 #1
hej Jakob... jeg synes det ser ud som der er så hatten den passer her :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/urlrewriting.asp
(find evt. "Building a URL Rewriting Engine" på siden)

mvh
Avatar billede snepnet Nybegynder
11. maj 2005 - 23:46 #2
ellers er der urlmapping pr. konfiguration i asp.net 2.0 - hvis du kan slippe afsted med at bruge det ;o)
søg på "URL Mapping" på denne side :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/migratingtoaspnet2.asp
mvh
Avatar billede basementjack Nybegynder
12. maj 2005 - 12:35 #3
Hej snepnet, jeg kan desværre ikke slippe afsted med at bruge 2.0.. Og det første link du sendte har jeg læst igennem før. Da forsøgte jeg med at lave det blog-eksempel de kommer med til sidst, men det fejlede. Og grunden til at det fejlede var så vidt jeg kunne forstå noget med at jeg skulle lave noget ved mine IIS indstillinger. Kan naturligvis godt være jeg tager fejl :)

Hvis jeg nu sætter nogle flere point af til dig, kunne du så ikke klippe/klistre de relevante ud fra artiklen, så de danner et bæredygtigt eksempel?..
Avatar billede snepnet Nybegynder
12. maj 2005 - 21:22 #4
halløj igen Jakob :o)

du kan da få et ufattelig simpelt (og ganske ubrueligt) eksempel :

lav en rewriter klasse :

using System;
using System.Web;

namespace RewriteSample
{
  public class SimpleRewriter
  {
    public static void RewriteUrl()
    {
      string newUrl = "WebForm1.aspx";
      HttpContext.Current.RewritePath(newUrl);
    }
}
}

ovenstående sørger for at den side brugeren rammer - uanset set hvad han/hun skriver (så længe det er med en aspx-extension).

du kan kalde metoden fra global.asax sådan her :

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    SimpleRewriter.RewriteUrl();           
}

fidusen er så, at du i din rewriter kan checke på den originale url (du kan få fat i den med HttpContext.Current.Request.Path), og får du eksempelvis sådan en her :

http://somehost/somesite/showgoodie1.aspx
så kan du i din rewriter finde 1-tallet med lidt strenggynmastik, og rewrite til f.eks.:
http://somehost/somesite/dynamicshowgoodie.aspx?goodieid=1

brugeren vil så stadig se "den pæne".

hvis du ikke har mulighed for at pille ved din iis - kan du kun gøre det for filtyper der af iis'en eksekveres af aspnet isapi'en - ellers vil koden ikke blive kørt (hvis du f.eks. prøver med extension .html).

håber det er bedre end ingenting, og at du har lidt at gå videre med.

mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 00:27 #5
Det string gymnastik du nævner, kan man ikke bruge web.config'en til det, som i artiklen:

<RewriterConfig>
  <Rules>
      <!-- Rules for Product Lister -->
      <RewriterRule>
        <LookFor>~/Products/Beverages\.aspx</LookFor>
        <SendTo>~/ListProductsByCategory.aspx?CategoryID=1</SendTo>
      </RewriterRule>
      <RewriterRule>
  </Rules>
</RewriterConfig>

Eksemplet er simpelt, ja, men.. jeg ved ikke om det er blevet for sent, men jeg føler ikke jeg helt gennemskuer det..
Avatar billede snepnet Nybegynder
13. maj 2005 - 02:03 #6
du må undskyld at jeg ikke svarer - jeg får ingen expmails :o(

eksemplet gør ikke andet end at lave en RewritePath(...), hvilket medfører at brugeren sådan set bliver stillet hen til en side udfra hvad de "Rewriter" den til - uden at adresse i adressebaren ændrer sig.

du kan sagtens bruge konfigurationsfilen til det - det er helt normalt at gøre det sådan, og det er også sådan det er lavet i ASP.NET 2.0.

du skal dog stadig selv lave din logik.... der er et andet eksempel der - det er sådan lidt mere direkte.... du kan prøve at se om det er lidt mere forklarende end det hos ms.

mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 10:32 #7
Jeg har lige fået alle expmail fra det sidste døgns tid.. :) Det andet eksempel siger mig heller ikke ret meget.

Men jeg har i hvertfald prøvet nu at ligge min global.asax op, og den ser nu sådan her ud:

<%@ Application language="C#" %>
<script runat="server">
    public class SimpleRewriter {
        public static void RewriteUrl() {
          string newUrl = "WebForm1.aspx";
          HttpContext.Current.RewritePath(newUrl);
        }
    }
    protected void Application_BeginRequest(Object sender, EventArgs e) {
        SimpleRewriter.RewriteUrl();         
    }
</script>

Men hvis jeg går ind på mit site, så står der ikke webform1.aspx som jeg forventede..
Har jeg misforstået hvad det første eksempel gør?.. Og hvordan laver jeg min logik, hvis jeg vil bruge web.config'en til det?..
Avatar billede basementjack Nybegynder
13. maj 2005 - 11:01 #8
Lavede en skrivebøf.. Havde gemt globla.asax istedet.. Ok.. Er på sporet af dit første eksempel.. Men mangler stadig det med logikken..
Avatar billede snepnet Nybegynder
13. maj 2005 - 11:11 #9
man kan jo sige at logikken er valgfri.... hvis du har lyst til at lave links der hedder noget med tal til sidst, og rewriter til noget med ?id=<tallet> er det den logik du skal lave...
det er rigtig noget jeg kan hjælpe dig med, da jeg ikke ved hvordan du synes linksne skal se ud for brugeren, og hvad de skal rewrites til.

for øvrigt .... det link jeg refererede til 13/05-2005 02:03:41 er det her :
http://www.codeproject.com/aspnet/urlrewriter.asp
(undskyld jeg glemte at sende det med .... de sidste par linier må have virket lidt besynderlige uden linket :o)

mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 12:31 #10
Hvis jeg laver min web.config om så der kun står (taget fra codeproject):
<configuration>
  <system.web>
        <urlrewrites>
            <rule>
                <url>/urlrewriter/show\.asp</url>
                <rewrite>show.aspx</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/wohs\.asp</url>
                <rewrite>show.aspx</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/show(.*)\.asp</url>
                <rewrite>show.aspx?$1</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/(.*)show\.html</url>
                <rewrite>show.aspx?id=$1&amp;cat=2</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/s/h/o/w/(.*)\.html</url>
                <rewrite>/urlrewriter/show.aspx?id=$1</rewrite>
            </rule>
        </urlrewrites>
    </system.web>
</configuration>

Så får jeg en fejl?

Min rewriter skal lave noget ligende det her:

/aspnet/artikel/rewrite/123.aspx
->
aspnet.aspx?sektion=artikel&gruppe=rewrite&id=123

Men jeg kommer ikke længere, når den fejler.. :/
Avatar billede snepnet Nybegynder
13. maj 2005 - 12:35 #11
så vidt jeg lige ummiddelbart kan se har du heller ikke nogen mapning på aspx-filer... ingen af de filtyper der er listen i den konfiguration du har sendt vil pr. default komme forbi .net eksekveringen (det er det du skal pille i iis'en for at få til at ske).
men æhh... hvilken fejl får du ?
mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 12:38 #12
FEJL ::::
Server Error in '/' Application.
Runtime Error
Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.

Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".

<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>


Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.

<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
    </system.web>
</configuration>


:::::::

En meget generic fejl. Men jeg problemet er at det er web.config-filen der forudsager fejlen, og jeg bruger slet ikke rewriteRules i global.asax endnu.. Der skriver den stadig bare om til webform1.aspx.
Avatar billede snepnet Nybegynder
13. maj 2005 - 12:42 #13
start med at gøre som den siger .... sæt <customErrors mode="Off"/> så du kan se en mere detaljeret fejl.
mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 12:52 #14
Fejlen ændrer sig ikke af den grund..
Avatar billede snepnet Nybegynder
13. maj 2005 - 12:56 #15
øhh... lyder sært. har du konfigurationen liggende i roden af dit web ?
mvh
Avatar billede snepnet Nybegynder
13. maj 2005 - 12:56 #16
den fortæller dig jo sådan set at den ikke vil fortælle dig fejlen pga. din konfig.
mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 12:57 #17
Ja den ligger i roden..
Dette giver en fejl:
<configuration>
  <system.web>
        <customErrors mode="Off"/>
        <compilation debug="true"/>
        <trace enabled="true" pageOutput="true" />
        <urlrewrites>
            <rule>
                <url>/urlrewriter/show\.asp</url>
                <rewrite>show.aspx</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/wohs\.asp</url>
                <rewrite>show.aspx</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/show(.*)\.asp</url>
                <rewrite>show.aspx?$1</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/(.*)show\.html</url>
                <rewrite>show.aspx?id=$1&amp;cat=2</rewrite>
            </rule>
            <rule>
                <url>/urlrewriter/s/h/o/w/(.*)\.html</url>
                <rewrite>/urlrewriter/show.aspx?id=$1</rewrite>
            </rule>
        </urlrewrites>
    </system.web>
</configuration>

Dette giver ikke en fejl:
<configuration>
  <system.web>
        <customErrors mode="Off"/>
        <compilation debug="true"/>
        <trace enabled="true" pageOutput="true" />
    </system.web>
</configuration>
Avatar billede basementjack Nybegynder
13. maj 2005 - 12:59 #18
Og det her giver også en fejl:
<configuration>
  <system.web>
        <customErrors mode="Off"/>
        <compilation debug="true"/>
        <trace enabled="true" pageOutput="true" />
        <urlrewrites>
            <rule>
                <url>default.aspx</url>
                <rewrite>default2.aspx</rewrite>
            </rule>
        </urlrewrites>
    </system.web>
</configuration>
Avatar billede snepnet Nybegynder
13. maj 2005 - 13:02 #19
det er også et custom element du har lagt ....  har du sørget for at det er defineret i toppen af konfigurationsfilen ?

lige under konfigurationen skal du lægge sådan en fyr her ind :

<configSections>
    <sectionGroup name="system.web">
        <section name="urlrewrites" type="<din configurationhandler*>"/>   
    </sectionGroup>
</configSections>

*skal så være den klasse der implementerer IConfigurationHandler

det hele er vist med i eksemplet fra codeproject... der implementerer han bemeldte interface på den klasse han også bruger som rewriter.

mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 13:20 #20
Det virker jo.. :) Selv om jeg blev nødt til at kopiere næsten det hele fra codeproject's eksemplet..

Vil du så lægge et svar og hvis du gider et rewrite eksempel på :

/aspnet/artikel/rewrite/123.aspx
->
aspnet.aspx?sektion=artikel&gruppe=rewrite&id=123

Så skulle jeg være klar til at lave min rewrite rules.. :)
Avatar billede snepnet Nybegynder
13. maj 2005 - 13:43 #21
mon ikke sådan noget her kan gøre det :

string original = HttpContext.Current.Request.Path;
string filename = System.IO.Path.GetFileNameWithoutExtension(original);       
string rewritten = String.Format("aspnet.aspx?sektion=artikel&gruppe=rewrite&id={0}", filename);
HttpContext.Current.RewritePath(rewritten);

mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 14:12 #22
Mente mere noget i stil med :
<configuration>
    <configSections>
        <sectionGroup name="system.web">
            <section name="urlrewrites" type="ThunderMain.URLRewriter.Rewriter, ThunderMain.URLRewriter, Version=1.0.783.30976, Culture=neutral, PublicKeyToken=7a95f6f4820c8dc3"/>     
        </sectionGroup>
    </configSections>
  <system.web>
        <customErrors mode="Off"/>
        <compilation debug="true"/>
        <trace enabled="true" pageOutput="true" />
        <urlrewrites>
            <rule>
                <url>/(.*)/(.*)/(.*)/(.*).aspx</url>
                <rewrite>$1.aspx?sektion=$2&gruppe=$3&id=$4</rewrite>
            </rule>
        </urlrewrites>
    </system.web>
</configuration>

Har ikke afprøvet det jeg skrev, men regner heller ikke med at det er rigtigt.. Og hvor blev dit svar af?.. :)
Avatar billede basementjack Nybegynder
13. maj 2005 - 14:45 #23
<urlrewrites>
            <rule>
                <url>/(.*)/</url>
                <rewrite>/$1.aspx</rewrite>
            </rule>
            <rule>
                <url>/(.*)/default.aspx</url>
                <rewrite>/$1.aspx</rewrite>
            </rule>
        </urlrewrites>

Leger selv med det lige nu.. Det øvereste der, virker ikke..
Den oversætter /aspnet/ med /aspnet.aspxDefault.aspx
Avatar billede snepnet Nybegynder
13. maj 2005 - 16:23 #24
ah... et svar ja :o)

men uf... jeg er en klaphat til regulære udtryk :o(
har du prøvet "the regulator" ?
(http://sourceforge.net/projects/regulator/) - den er for lækker til at arbejde med den slag i :oP)

mvh
Avatar billede basementjack Nybegynder
13. maj 2005 - 16:39 #25
Jeg sidder og læser en tutorial på http://www.regular-expressions.info .. Men prøver da lige the regulator.. :)
Avatar billede basementjack Nybegynder
13. maj 2005 - 17:12 #26
Ved ikke om det har noget med regex at gøre, men når jeg bruger:
            <rule>
                <url>/(aspnet|php)/</url>
                <rewrite>/$1.aspx</rewrite>
            </rule>
localhost/aspnet/
skulle blive
localhost/aspnet.aspx
, men bliver istedet
localhost/aspnet/aspnet.aspxDefault.aspx

Hvordan får jeg den til at holde op med at putte default.aspx på og holde op med tage den oprindelige url med?..
Avatar billede basementjack Nybegynder
13. maj 2005 - 17:59 #27
To ændringer og den opfører sig jeg ville have.. :)
            <rule>
                <url>/(aspnet|php)/(default.aspx)</url>
                <rewrite>/$1.aspx</rewrite>
            </rule>
og
        public string GetSubstitution(string zPath) {
            Regex oReg;
            foreach(XmlNode oNode in _oRules.SelectNodes("rule")) {
                oReg=new Regex(oNode.SelectSingleNode("url/text()").Value, RegexOptions.IgnoreCase);
                Match oMatch=oReg.Match(zPath);
                if(oMatch.Success) {
                    return oReg.Replace(zPath,oNode.SelectSingleNode("rewrite/text()").Value);
                }
            }
            return zPath;
        }
Avatar billede snepnet Nybegynder
13. maj 2005 - 23:17 #28
fedt at du er på banen :o)
mvh
Avatar billede basementjack Nybegynder
14. maj 2005 - 00:39 #29
Ja det er fedt.. :)
Takker..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Cognizant Technology Solutions Denmark ApS

Data Architect

Cohenware ApS

.NET Backend Developer

KMD A/S

.NET Developer