8

我正在编写一个基于某些输入动态创建 URL 的 Web 应用程序,以供客户端在其他时间使用。为了讨论起见,这些 URL 可以包含某些字符,例如正斜杠(即 '/'),不应将其解释为实际 URL 的一部分,而应仅作为参数。例如:

http://mycompany.com/PartOfUrl1/PartOfUrl2/ArgumentTo/Url/GoesHere

如您所见,ArgumentTo/Url/GoesHere确实有正斜杠,但这些应该被忽略或转义

这可能是一个不好的例子,但手头的问题更笼统,适用于其他特殊字符

那么,如果 URL 的某些部分只是参数,不应该用于解析实际的 Web 请求,那么有什么好的方法来处理呢?

更新:

鉴于一些答案,我意识到我没有指出一些希望有助于澄清的部分。

我想保持这种相当语言不可知论,因为如果客户可以提出请求,那就太好了。例如,如果客户端知道它想要传递ArgumentTo/Url/GoesHere,那么如果可以将其编码为一个唯一的字符串,服务器可以在其中转身并对其进行解码以供使用,那就太好了。

我们是否可以假设 .NET Framework 中的 HttpUtility.HtmlEncode/HtmlDecode 等类似功能在其他系统/平台上可用?URL 不一定要漂亮,因此路径中包含真实的单词并不重要。

像参数的base64编码这样的东西会起作用吗?

似乎 base64 编码/解码在任何平台/语言上都相当容易获得。

4

5 回答 5

5

您没有说您使用的是哪种语言,但 PHP 具有有用的urlencode功能,而 C# 具有HttpUtility.URLEncode并且Server.UrlEncode应该很好地编码您的部分 URL。

如果您需要另一种方式,此页面有一个编码值列表。例如:/ == %2f

更新

根据您更新的内容,我会说使用 Voyagerfan 的 URLRewriting 的想法来制作类似的东西:

http://www.example.com/([A-Za-z0-9/]+) http://www.example.com/?page=$1

然后使用应用程序 GET 解析器将其过滤掉。

于 2008-10-27T22:46:11.300 回答
3

您可以使用Apache 重写来重写http:// mycompany.com/PartOfUrl1/PartOfUrl2http:// mycompany.com/path/to/program.php然后ArgumentTo/Url/GoesHere作为标准 GET 参数传入。所以服务器实际上发回的是响应http:// mycompany.com/path/to/program.php?arg=ArgumentTo/Url/GoesHere

重写是防止技术变化的好方法(例如,从 PHP 切换到 ASP 不会改变您的 URL)并同时为您的用户提供友好的 URL。

更新

使用您的示例 URL 并以我之前所说的内容为基础,我会说在您的 httpd.conf 或 .htaccess 中使用此代码:

RewriteEngine On

RewriteRule http:// mycompany.com/PartOfUrl1/PartOfUrl2/([A-Za-z0-9]) http://mycompany.com/path/to/program.php?arg=$1

http://(顺便说一句,删除 中第一个之后的空格RewriteRule,加上该行需要不包含换行符。)

更改路径、文件名、arg 名称等都可以;这里的关键部分是正则表达式 ( ([A-Za-z0-9])) 和$1.

于 2008-10-27T22:51:35.750 回答
1

是的,Base64 编码您的参数将适用于您,但是您需要确保您的整个 URL 在目标浏览器的大小限制之下(根据此页面,IE 4-7 为 2083 个字符)。

于 2008-10-27T23:28:23.383 回答
0

我相信如果使用.net,您正在寻找的是 HttpUtility.EncodeUrl() 方法,因为它有很多覆盖。看这里:http: //msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx

于 2008-10-27T22:46:17.417 回答
0

在服务器对象上使用 HtmlEncode 和 Decode 方法。我相信这将删除大多数不应该出现的字符并处理其他内容,例如空格等。

这是 MSDN 文章:http: //msdn.microsoft.com/en-us/library/ms525347.aspx

于 2008-10-27T22:46:22.843 回答