【问题标题】:URL replace spaces with + signsURL 用 + 号替换空格
【发布时间】:2015-05-10 10:18:24
【问题描述】:

我最近创建了一个关于如何在 URL 中使用 /+ 等符号的问题,但这让我想到了另一个问题,如何替换 URL 中的空格,为什么?

如果我的网址是something.com/Find/this is my search,那为什么错了?为什么要改成something.com/Find/this+is+my+search

我已经搜索和尝试解决方案超过 5 个小时了。我在任何地方看到的答案都是一样的,使用httputility.urlencodeUri.escapeDataString。但我试过这样做:

string encode = Uri.EscapeDataString(TextBoxSearch.Text);
Response.Redirect("/Find/" + encode );

string encode = HttpUtility.UrlEncode(TextBoxSearch.Text);
Response.Redirect("/Find/" + encode );

string encode = encode.replace(" ", "+")
Response.Redirect("/Find/" + encode);

这些都不起作用,它们不会用任何东西替换空格(string.replace 会,但这也会导致字符串发生变化,这意味着它无法在下一页的数据库中找到值)。

如果我对整个 URL 进行编码,那么我所有的 / 都会变成 %,这显然不是我想要的。

我需要什么

If I redirect like this Response.Redirect("/Find/" + search);.
And I make a search like this "Social media".
I then get the queryString on the next page and use it to load info from my database.
Now I want to display info about Social media from my database.
but at the same time I want the url to say Find/Social+media.

编辑:

我的尝试:

string encode = HttpUtility.UrlEncode(TextBoxSearch.Text);
Response.Redirect("/Find/" + encode);

这给了我一个“404.11 - 请求过滤模块被配置为拒绝包含双转义序列的请求。”在请求的 URL http://localhost:65273/Find/social+media

在我的 Find.aspx onLoad() 中:

IList<string> segments = Request.GetFriendlyUrlSegments();
string val = "";
for (int i = 0; i < segments.Count; i++)
    {
       val = segments[i];
    }
search = val;

【问题讨论】:

  • 这不是一个有效的网址,网址中的空格是%20
  • 当我在 localhost 上运行并使用空格进行搜索时,它工作正常。即使没有“+”替换。但是在我阅读之后我明白我不能在 url 中使用空格那么我该如何替换它们呢?
  • 您的浏览器会将它们变成%20,所以不用担心。
  • 您的 URL 是如何被提取的?你使用 ASP.NET MVC 吗?
  • 空格不比加号安全。

标签: c# asp.net url urlencode


【解决方案1】:

HttpUtility.UrlEncode+ 替换空格,但正如Patrick 所说,最好使用%20。因此,您可以使用String.Replace 来完成此操作。

var encode = TextBoxSearch.Text.Replace(" ", "%20");

也就是说,您还应该对值进行编码以防止任何类型的 XSS 攻击。您可以通过首先编码,然后从值中替换 + 来完成这两个操作。

var encode = HttpUtility.UrlEncode(TextBoxSearch.Text).Replace("+", "%20");

【讨论】:

  • 使用它会给我 url http://localhost:65273/Find/social media 但如果我将它复制并粘贴到这里,它会显示 http://localhost:65273/Find/social%20media。我的浏览器是否删除了%20
  • 有些浏览器试图将url人性化,这确实是可能的。
  • 看来 FF 是这样做的。在 Chrome 中,我得到了 %20。太糟糕了,这只处理空格而不是 /、+、() 等符号。但我的问题是如何替换空格,所以这将是公认的答案
【解决方案2】:

%20 替换空格是完全可以的,因为这是空格的转义形式。 %20 是 URL 安全的,所以你可以使用它。

事实上,%20 只是 ASCII code 的十六进制值,用于空格。使用HttpUtility.UrlEncode 就足够了。

最好使用%20 而不是+,如以下答案所述:When to encode space to plus (+) or %20?

【讨论】:

  • 对,但我该怎么做呢?我无法改变我的查询字符串,无论我尝试什么空间都在 url 中保留一个空间。
  • 对 URL 进行编码就足够了。 .NET 中返回的字符串是好的。
  • 是因为我在运行本地主机吗?所以基本上我不需要编码任何东西? Response.redirect("/Find/" + search) 会起作用吗?
  • 如果你使用HttpUtility.UrlEncode,你就准备好了。什么不起作用?
  • 如果我执行string encode = HttpUtility.UrlEncode(TextBoxSearch.Text); Response.Redirect("/Find/" + encode );,那么搜索后的结果 URL 仍然是“localhost/Find/here are spaces”。它们不会被 %20 替换。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 2013-07-08
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多