我正在进行URL重写,我在asp.net网站上找到了一个教程, 我这样做的方式是
我正在输入http://localhost:1573/WebNew/web/first-web
的网址现在我已经开始了一个班级
public class FixURLs : IHttpModule
{
public FixURLs()
{
//
// TODO: Add constructor logic here
//
}
#region IHttpModule Members
public void Dispose()
{
// do nothing
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
#endregion
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
/*// checking page extension
switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
{
case ".bmp":
case ".gif":
case ".jpg":
case ".jpe":
case ".jpeg":
case ".png":
case ".css":
case ".js":
case ".txt":
case ".swf":
// don't redirect, these requests may required in many cases
return;
break;
}*/
if (app.Request.RawUrl.ToLower().Contains("/web/"))
{
**if (app.Request.RawUrl.ToLower().Contains(".png")
|| app.Request.RawUrl.ToLower().Contains(".gif")
|| app.Request.RawUrl.ToLower().Contains(".js"))
{
return;
} **
DatabaseLayer dbLayer = new DatabaseLayer();
string urlFromBrowser = app.Request.RawUrl.ToLower();
string[] urlFormat = urlFromBrowser.Split('/');
urlFromBrowser = urlFormat.GetValue(2).ToString() + "/" + urlFormat.GetValue(3).ToString();
int WebId = dbLayer.GetWebURLId(urlFromBrowser.Trim());
app.Context.RewritePath("Default.aspx", "", "WebId="+WebId);
}
}
但问题是,它没有重定向到Default.aspx页面。
我收到以下错误:
描述:HTTP 404.您正在查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。
请求的网址:/WebNew/web/Default.aspx
我可以看到它正在请求URL /webNew/web/Default.aspx,但我只需要/webnew/default.aspx?WebId=2
请帮助我
修改
答案是肯定的,但是我无法接受你的回答,也没有评论按钮对我有效,这就是我编辑帖子的原因。我收到JavaScript错误:预期对象和对象问题为空。
@Waqas Raja谢谢你回答,现在工作正常。但是,当我将断点放在Default.aspx页面的(!IspostBack)事件中时,我可以看到它已经过了 8 次。加载页面后,几张图片消失了。多次刷新是问题吗?任何想法为什么它会一次又一次地去if(!IsPostBack)事件。 谢谢你的帮助
EDIT1
@Waqas Raja我会接受你从不同的浏览器登录后回答。
EDIT2
@Waqas Raja我正在我的主页上显示图像
还有其他一些图像也以这种方式显示,正常加载时它们都正常,但是当我使用URL重写时,我只能看到alt文本。
我也试过这个
但结果相同。 :-(任何建议?
通过检查原始网址,我可以看到除了页面之外还有很多请求,例如jpg,.js就像你提到的那样。 我已更新代码,是否正确?因为我无法看到图像和少量的javascript函数。
EDIT3
@Waqas Raja非常感谢您的帮助。我现在可以看到图像了。我已将HTML图像移除到asp:Image controla并将ImageURL保留为〜/ images / facebook_icon.png。
但我还是看不到页面上的JS文件效果,我把src =“〜/ JS / jQuery.js”但它仍然无法正常工作。我已将您提到的代码放在我的班级中[就在您引导我的地方]。
答案 0 :(得分:1)
问题在于您的重写路径,请将其替换为以下
app.Context.RewritePath("~/webnew/Default.aspx", "", "WebId=" + WebId);
编辑1 您的要求已更改,但让我尝试解释哪里出错了。
问题必须与你的相对路径的图像有关,并且在外部javascript和css的情况下也可能发生。
您应该使用相对于根目录的路径。
~
指的是虚拟目录的根目录,其资源(通常是页面或某个时间的外部css)正在被访问。
~/pathToImagesFolder/imageName.ext
在包含javascript和css并使用相对于您网站或虚拟目录的主目录的路径时,您应该小心谨慎。但是在CSS内部,在这方面没有必要采取措施。
关于IsPostBack
问题
我想问题是你的if条件
if (app.Request.RawUrl.ToLower().Contains("/web/"))
在这里,您要重定向网址中包含/web/
的任何请求,并且很可能在您的网页内部访问某些资源,例如图片或外部css或js,其网址中包含/web/
,因此请求到达它被重定向到default.aspx并且问题引发。您可以通过查看Request.RawUrl
<{1}}事件Page_Load
中的Default.aspx
进行确认
因此,在比较请求的资源路径和重定向时,您需要更多检查。如果你检查并跳过重定向所有以.css .jpg .JPG .js .gif
e.t.c
我希望你的理解能够立即建立。
编辑2 您需要跳过所有其他扩展程序
// checking page extension
switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
{
case ".bmp":
case ".gif":
case ".jpg":
case ".jpe":
case ".jpeg":
case ".png":
case ".css":
case ".js":
case ".txt":
case ".swf":
// don't redirect, these requests may required in many cases
return;
break;
}