0

我正在处理 URL 重写,我在 asp.net 网站上找到了一个教程,我这样做的方式是

我正在输入的 URL 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。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。

请求的 URL:/WebNew/web/Default.aspx

我可以看到它正在请求 URL /webNew/web/Default.aspx 但我只需要 /webnew/default.aspx?WebId=2

请帮助我

编辑

谢谢你的回答,但我无法接受你的回答,评论按钮也对我有用,这就是我编辑帖子的原因。我收到 JavaScript 错误:Object expected and Object question is null。 在此处输入图像描述

@Waqas Raja 感谢您的回答,现在工作正常。但是当我在 Default.aspx 页面的 (!IspostBack) 事件中放置断点时,我可以看到它出现了8次。加载页面后,一些图像消失了。是多次刷新的问题吗?知道为什么它会一次又一次地发生在 if(!IsPostBack) 事件中。谢谢你的帮助

编辑1

@Waqas Raja 我会在从其他浏览器登录后接受您的回答。

编辑2

@Waqas Raja 我在我的主页上显示这样的图像

还有其他几张图片也以这种方式显示,它们在正常加载时都正常显示,但是当我使用 URL 重写时,我只能看到 alt 文本。

我也试过这个

但同样的结果。:-( 有什么建议吗?

通过检查原始 url,我可以看到除了页面之外还有许多请求,即 jpg、.js 就像你提到的那样。我已经更新了代码,是否正确?因为我看不到图像和一些 javascript 函数。

编辑3

@Waqas Raja 非常感谢您的帮助。我现在可以看到图像了。我已将 HTML 图像删除到 asp:Image controla 并将 ImageURL 保留为 ~/images/facebook_icon.png。

但是还是看不到页面上的js文件效果,我放了src="~/JS/jQuery.js"还是不行。我已将您提到的代码放在我的课堂上[就在您指导我的地方]。

4

1 回答 1

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/在 URL 中的任何请求,并且很可能在您的页面内您正在访问一些资源,例如包含/web/在其 url 中的图像或外部 css 或 js,因此当请求到达时,它被重定向到 default.aspx 和问题提高。您可以通过调查来Request.RawUrl确认Page_LoadDefault.aspx

因此,在比较请求的资源路径和重定向时,您需要进行更多检查。.css .jpg .JPG .js .gif如果您检查并跳过重定向所有以等扩展名结尾的网址,那就更漂亮了

我希望你的理解现在建立。

编辑 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;
}
于 2011-03-23T09:58:34.227 回答