【问题标题】:Url rewrite with ASP.NET query string使用 ASP.NET 查询字符串重写 URL
【发布时间】:2016-08-25 20:16:45
【问题描述】:

我想用 ASP.NET 中的查询字符串重写 URL。 URL 如下所示:

http://localhost:51392/productdetails.aspx?id=zdpMPZVXkDtjw92Crx7eew==

我想把网址改写成这样:

http://localhost:51392/Details/zdpMPZVXkDtjw92Crx7eew==

我曾尝试使用以下方法重写 url(类似这样):

 <urlMappings>
      <add url="~/Shop"   mappedUrl="~/shop.aspx"/>
</urlMappings>

但我不太确定如何正确映射 URL 和查询字符串??什么是最简单的,或可以用来实现这一目标的其他方法?

谢谢!

附:伙计们,这就是我尝试访问重写 URL 的方式:

<a href='<%# "/productdetails.aspx?id=" + RL_DAL.RijndaelHelper.AES.Encrypt(Eval("ProductID").ToString(),"key_to_enrypt")  %>'><%# Eval("ProductName") %>

【问题讨论】:

  • 如果我没记错的话,您可以使用 ServerVariables HTTP_X_ORIGINAL_URL 到代码中的查询字符串部分。
  • 你能给我一个例子吗? :)
  • 检查可能的重复项。我想你的问题已经回答了
  • 还是不明白,我应该在哪里使用这个代码?在我试图访问的重写页面的页面加载上还是?

标签: c# asp.net .htaccess mod-rewrite url-rewriting


【解决方案1】:

在 asp.net 中,托管在 IIS 平台上 -

  1. URL Rewrite模块安装到IIS中
  2. 将此添加到网站的 web.config (system.webServer) 部分

    <rewrite>
        <rules>
            <rule name="rewrite" stopProcessing="true">
              <match url="productdetails.aspx" />
              <conditions>
                <add input="{QUERY_STRING}" pattern="id=([a-zA-Z0-9=]+)" />
              </conditions>
              <action type="Rewrite" url="/Details/{C:1}" appendQueryString="false" />
            </rule>
        </rules>
    </rewrite>
    

然后对/productdetails.aspx?id=zdpMPZVXkDtjw92Crx7eew== 的每个请求都将重写http://localhost:51392/Details/zdpMPZVXkDtjw92Crx7eew==。但是重写并不意味着它会改变用户在浏览器中,只是服务器上的目的地。

但是,如果您想重定向它,请将规则更改为:

<rule name="redirect" stopProcessing="true">
  <match url="productdetails.aspx" />
  <conditions>
    <add input="{QUERY_STRING}" pattern="id=([a-zA-Z0-9=]+)" />
  </conditions>
  <action type="Redirect" url="/Details/{C:1}" redirectType="Permanent" appendQueryString="false" />
</rule>

这将执行永久 301 重定向,在操作类型上执行临时 307 重定向更改 PermanentTemporary

请参阅Redirect vs Rewrite,了解有关两者区别的更多信息。


使用我给出的重定向规则:

用户输入/productdetails.aspx?id=zdpMPZVXkDtjw92Crx7eew==他们 被重定向到/Details/zdpMPZVXkDtjw92Crx7eew== 和那个 URL 必须能够处理请求。这种情况通常是 在将网站移动到新平台/URL 结构时使用。

反之,用户输入/Details/zdpMPZVXkDtjw92Crx7eew==,网站处理/productdetails.aspx?id=zdpMPZVXkDtjw92Crx7eew==上的请求,使用:

<rule name="rewrite">
    <match url="Details/([a-zA-Z0-9=]+)" />
    <action type="Rewrite" url="/productdetails.aspx?id={R:1}" />
</rule>

(Example on GitHub)

【讨论】:

  • “但重写并不意味着它会改变用户在浏览器中的位置,只是服务器上的目的地。”但我的问题的重点是在用户浏览器中重写 URL:/
  • 那么你想重定向它:-) 使用第二条规则。
  • 添加了重写与重定向的链接,请查看该博客文章顶部的表格,其中概述了两者之间的区别。
  • 好的,我使用第二条规则,但它根本没有重写 URL...当我现在点击链接时,它显示给我:HTTP Error 404.0 - Not Found
  • 现在试试,我错过了目标网址中的斜线
【解决方案2】:

在 global.asax 中

void RegisterRoutes(RouteCollection routes)
    {
         routes.MapPageRoute("Products","Products/{id}/{productname}",
                           "~/productdetails.aspx");
}

在 products.aspx 中

<ahref='<%#string.Format("/Products/{0}/{1}",Eval("id"),Clean.CleanUrl(Eval("ProductName").ToString())) %>'><%# Eval("ProductName") %></a>

在 productsdetails.aspx.cs 中

if (!IsPostBack)
        {
            if (RouteData.Values["id"] != null)
            {
               loadproduct();

            }
}

void loadproduct()
{
 select .............  where id= RouteData.Values["id"].ToString();
}

这是干净的类

public static class Clean
    {
        public static string CleanURL(this string kelime)
        {
            if (kelime == "" || kelime == null) { return ""; }
            kelime = kelime.Replace("ş", "s");
            kelime = kelime.Replace("Ş", "S");
            kelime = kelime.Replace(".", "");
            kelime = kelime.Replace(":", "");
            kelime = kelime.Replace(";", "");
            kelime = kelime.Replace(",", "");
            kelime = kelime.Replace(" ", "-");
            kelime = kelime.Replace("!", "");
            kelime = kelime.Replace("(", "");
            kelime = kelime.Replace(")", "");
            kelime = kelime.Replace("'", "");
            kelime = kelime.Replace("ğ", "g");
            kelime = kelime.Replace("Ğ", "G");
            kelime = kelime.Replace("ı", "i");
            kelime = kelime.Replace("I", "i");
            kelime = kelime.Replace("ç", "c");
            kelime = kelime.Replace("ç", "C");
            kelime = kelime.Replace("ö", "o");
            kelime = kelime.Replace("Ö", "O");
            kelime = kelime.Replace("ü", "u");
            kelime = kelime.Replace("Ü", "U");
            kelime = kelime.Replace("`", "");
            kelime = kelime.Replace("=", "");
            kelime = kelime.Replace("&", "");
            kelime = kelime.Replace("%", "");
            kelime = kelime.Replace("#", "");
            kelime = kelime.Replace("<", "");
            kelime = kelime.Replace(">", "");
            kelime = kelime.Replace("*", "");
            kelime = kelime.Replace("?", "");
            kelime = kelime.Replace("+", "-");
            kelime = kelime.Replace("\"", "-");
            kelime = kelime.Replace("»", "-");
            kelime = kelime.Replace("|", "-");
            kelime = kelime.Replace("^", "");
            return kelime;
        }
    }

【讨论】:

  • 它重写了URL,但是答案不包括如何用查询字符串重写URL??
【解决方案3】:

在 global.asax.cs 文件中,尝试以这种方式添加代码。

    void Application_BeginRequest(object sender, EventArgs e) {

    string fullpath = Request.Url.ToString();

    if (fullpath.Contains("/Details/zdpMPZVXkDtjw92Crx7eew==")) {
        Context.RewritePath("/productdetails.aspx?id=zdpMPZVXkDtjw92Crx7eew==");
    }
   }

然后在 Productdetails.aspx.cs 文件中,您可以尝试读取 Id。

Label1.Text = Request.QueryString["id"];

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2016-02-12
    • 2014-08-07
    • 2011-08-02
    • 2012-01-18
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多