如何在编写URL时避免非法字符?

时间:2008-10-27 22:40:34

标签: base64

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

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

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

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

因此,如果有一些URL只是参数并且不应该用于解析实际的Web请求,那么处理这个问题的好方法是什么?

更新

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

我想保持这种语言不可知,因为如果客户端可以提出请求会很好。例如,如果客户端知道它想要传递 ArgumentTo / Url / GoesHere ,那么如果它可以编码唯一那就太棒了>服务器可以转向的字符串,解码使用它。

我们可以假设.NET Framework中的HttpUtility.HtmlEncode / HtmlDecode等类似函数可以在其他系统/平台上使用吗?网址不一定是漂亮,因此路径中的真实单词并不重要。

参数的base64编码是否有效?

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

5 个答案:

答案 0 :(得分:5)

你没有说你正在使用哪种语言,但PHP有一个有用的urlencode函数,而C#有HttpUtility.URLEncodeServer.UrlEncode,它们可以很好地编码你的部分URL。 / p>

如果您需要其他方式this page有一个编码值列表。例如:/ == %2f

更新

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

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

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

答案 1 :(得分:3)

您可以使用Apache rewriteshttp:// mycompany.com/PartOfUrl1/PartOfUrl2重写为http:// 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。

更新

使用您的示例网址并根据我之前所说的内容构建,我会说在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

答案 2 :(得分:1)

是的,Base64编码您的参数将适用于您,但是您需要确保您的整个URL低于目标浏览器的大小限制(IE 4 - 7,according to this page为2083个字符)。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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