Urlrewriting, problemer med billeder og css

Tags:    asp.net

<< < 12 > >>
X Hey..

Jeg har forsøgt mig lidt frem med noget urlrewriting, det er også lykkedes mig at få det til at fungere, sammen med at rewrite action tagget på min form.

Problemet er bare, så længe jeg har aktiveret urlrewriting metoden, så ryger referencer til mine billeder, scripts, css, osv. aktiverer jeg det derimod, er det fint grafisk.. jeg har så forsøgt at ændre på stien til billederne og stylesheetet men det vil simpelthen ikke virke..

Her er lidt kode, beklager at der er lidt meget, men jeg ved ikke hvor fejlen opstår.

RewriteRules.Config
Et xml ark med regularexpressions, som laver de egentlige regler for urlrewritning metoden.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<urlrewrites>
<rule name="ModulePage">
<url>/([a-zA-Z][\\w-]{1,149})/([a-zA-Z][\\w-]{1,149})\\.html</url>
<rewrite>/Default.aspx?ModuleName=$2</rewrite>
</rule>
<rule name="CategoryPage">
<url>/([a-zA-Z][\\w-]{1,149})/([a-zA-Z][\\w-]{1,149})/([a-zA-Z][\\w-]{1,149})\\.html</url>
<rewrite>/Default.aspx?ModuleName=$2&SubModuleName=$3</rewrite>
</rule>
<rule name="Item Page">
<url>/([a-zA-Z][\\w-]{1,149})/([a-zA-Z][\\w-]{1,149})/([a-zA-Z][\\w-]{1,149})/([a-zA-Z][\\w-]{1,149})\\.html</url>
<rewrite>/Default.aspx?ModuleName=$2&SubModuleName=$3&ItemName=$4</rewrite>
</rule>
</urlrewrites>

UrlRewriteModule.cs
public class UrlRewriteModule : IHttpModule, IRequiresSessionState
{

public void Dispose()
{


}

public void Init(HttpApplication context)
{

context.BeginRequest += new EventHandler(Rewrite_BeginRequest);
}

public void Rewrite_BeginRequest(object sender, EventArgs args)
{
string strPath = HttpContext.Current.Request.Url.AbsolutePath;

UrlRedirection oPR = new UrlRedirection();

string strURL = strPath;

string strRewrite = oPR.GetMatchingRewrite(strPath);

if (!String.IsNullOrEmpty(strRewrite))
{
strURL = strRewrite;
}
else
{
strURL = strPath;
}

HttpContext.Current.RewritePath("~" + strURL);
}
}

UrlRedirection.CS

public class UrlRedirection
{
XmlDocument oDoc = new XmlDocument();

private string strFile = System.Web.HttpContext.Current.Server.MapPath("~/RewriteRules.config");

private List<RedirectRule> colRules;

public List<RedirectRule> Rules
{
get
{

if (colRules == null)
{

colRules = GetRules();

}

return colRules;

}
}

List<RedirectRule> GetRules()
{
List<RedirectRule> col = new List<RedirectRule>();
XmlNode _oRules = oDoc.SelectSingleNode("//urlrewrites");

foreach (XmlNode oNode in _oRules.SelectNodes("rule"))
{

if ((oNode.SelectSingleNode("url/text()") != null) && (oNode.SelectSingleNode("rewrite/text()") != null))
{
RedirectRule oR = new RedirectRule();
oR.Name = oNode.Attributes["name"].Value;
oR.URL = oNode.SelectSingleNode("url/text()").Value;
oR.Rewrite = oNode.SelectSingleNode("rewrite/text()").Value;
col.Add(oR);
}

}

return col;


}

public string GetMatchingRewrite(string URL)
{
string strRtrn = "";
Regex oReg;

foreach (RedirectRule oRule in Rules)
{

oReg = new Regex(oRule.URL);
Match oMatch = oReg.Match(URL);

if (oMatch.Success)
{
strRtrn = oReg.Replace(URL, oRule.Rewrite);
}

}

return strRtrn;
}

public UrlRedirection()
{

oDoc.Load(strFile);

}

}

public class RedirectRule
{

string strUrl = "";

string strRewrite = "";

string strName = "";

public string Name
{
get { return strName; }
set { strName = value; }
}

public string URL
{
get { return strUrl; }
set { strUrl = value; }
}

public string Rewrite
{
get { return strRewrite; }
set { strRewrite = value; }
}

}

Hertil skal som nævnt siges jeg overskriver action tagget på min form, men uden det, virker billeder og css stadig ikke..

Er der nogen der kan sige hvad det er der går galt? Når urlrewriting er "on" .. kan jeg heller ikke direkte requeste stylesheetet eller billederne i min browser.. som om hvis ikke der rammes med en af de regularer expressions, så fungere det bare ikke..

Kan det have noget at gøre med at når jeg linker til et billede i min kode <img src="test.jpg"> så laver den et egentligt request til filen, og derved kører igennem min urlrewrite metode?

Håber nogen har et bud.

På forhånd tak
Jacob Jensen



12 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Nu har jeg ikke læst koden men kun hvad problemet er. Jeg tror alligevel jeg har en ide om hvorfor det sker.

Normalt er stien til din side eksempelvis:

http://domæne.dk/show.aspx?id=1

Med rewrite bliver det til

http://domæne.dk/1/show.aspx

Når du så går ind på siden vil browseren tro at de billeder og css filer du refererer til ligger i en mappe der hedder http://domæne.dk/1/
Så egentlig skal du skrive <img src="../test.jpg" /> på denne underside for at få browseren til at kigge i mappen der ligger et niveau over.

For at løse det kan du lave alle dine links til billeder med en sti der er relativ til domænet i stedet for til den nuværende mappe. Det gør du ved at skrive en skråstreg foran, således:

<img src="/test.jpg">


Håber det var forståeligt, ellers må du lige spørge igen :)




Hej Martin.

Tak for din tid..

Men problemet er lidt mere akavaet end som så, jeg har forsøgt med forskellige stier til mine billeder og css, og lave stierne relative fra roden var også mit umiddelbare første bud.

Har du et andet ?

Mvh



Det lyder underligt hvis det ovenstående ikke virker synes jeg. Kan jeg se hjemmesiden et sted?



Nej desværre.. den er stadig på tegne bordet, lokalt... og med vs.net developer webserver...

JEg kan maile dig de 3 givne filer, du blot skal inkludere i et projekt - det virker ret godt, hvis du i fremtiden kunne få brug for noget lignende :)



Det må du gerne, jeg sender lige min adresse over udvikler-mail systemet.



Jeg er kommet lidt nærmere :)


http://scottonwriting.net/sowblog/posts/943.aspx

Det er fordi alle mine request bliver suget af asp.net enginen, og de bliver derfor også "rewritet" ..

Men jeg kan sku ikke få den anbefalede løsning til at virke :)

Jeg har postet en tråd derinde..



ok, ejg havde ikke regnet med at du havde gjort så det hele kom igennem ASP.NET-enginen.

Jeg har lige læst din besked inde på den side der. Er det rigtigt forstået at problemet nu er kogt ned til at finde ud af hvor

<HttpHandler pattern = "(\\.gif|\\.js|\\.jpg|\\.zip|\\.jpeg|\\.jpe|\\.css)$" type = "Dottext.Common.UrlManager.BlogStaticFileHandler, Dottext.Common" handlerType = "Direct" />

skal placeres i din web.config? I såfald kan du se hvordan det skal placeres på: http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=307

Altså noget i stil med:
Fold kodeboks ind/udKode 




ok, ejg havde ikke regnet med at du havde gjort så det hele kom igennem ASP.NET-enginen.

Jeg har lige læst din besked inde på den side der. Er det rigtigt forstået at problemet nu er kogt ned til at finde ud af hvor

<HttpHandler pattern = "(\\.gif|\\.js|\\.jpg|\\.zip|\\.jpeg|\\.jpe|\\.css)$" type = "Dottext.Common.UrlManager.BlogStaticFileHandler, Dottext.Common" handlerType = "Direct" />

skal placeres i din web.config? I såfald kan du se hvordan det skal placeres på: http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=307

Altså noget i stil med:
Fold kodeboks ind/udKode 



Men HttpHandlers skal vel have et add/remove eller lignende for at må eksistere i web.config.. ikke blot et pattern ? kan du få det til at virke ?


EDIT: Sorry, skulle ikke være et svar



Indlæg senest redigeret d. 01.05.2006 10:51 af Bruger #5789
Nej, jeg kan heller ikke lige få til at virke.
Jeg tror at det han skriver med:

<HttpHandler pattern = "(\\.gif|\\.js|\\.jpg|\\.zip|\\.jpeg|\\.jpe|\\.css)$" type = "Dottext.Common.UrlManager.BlogStaticFileHandler, Dottext.Common" handlerType = "Direct" />

Er noget specielt til det der '.Text' og ikke noget der er alm. i web.config.

-

Den måde jeg ville lave sådan noget urlrewriting i ASP.NET ville være noget hvor det stadig kun er de almindelige ASP.NET filer der kommer igennem runtimen, men så bare lade den url brugeren ser se således ud:

http://domæne.dk/Nyheder/2006/05/01/Nyhed.aspx

Selvom der ikke er nogen Nyhed.aspx vil denne request blive sendt igennem runtimen da IIS tror det er en aspx-fil.

Der er også nogen der skriver
http://domæne.dk/Nyheder.aspx/2006/05/01/


Jeg har ikke umiddelbart nogen løsning på det på den anden måde. Andet end at du bliver nød til at skrive noget kode der får lavet urlen korrekt til alle disse billed, css og javascript-filer.



Hey..

Efter nærmere undersøgelser, har jeg fundet ud af at problemet er at jeg gennem de regex rammer mapperne, ved at ramme mapperne ex domæne.dk/nyheder/ .. dette må ikke finde sted, men blot /nyheder ... så kører den i hvert fald ikke på andre filer..

Smider du ikke lige et svar, som tak for din tid.

Mvh



<< < 12 > >>
t