我可以在网址中使用逗号吗?

时间:2008-10-13 18:46:21

标签: asp.net iis url url-rewriting

我通常使用网址重写将内容ID传递给我的网站,所以

 Foo.1.aspx 

重写

 Foo.aspx?id=1

对于特定的应用程序,我需要将多个ID传递给单个页面,所以我重写了一些事情来接受这个:

 Foo.1,2,3,4,5.aspx

这在Cassini(Visual Studio的内置临时Web服务器)中运行良好,但是当我在运行IIS的实时服务器上尝试时,它给了我“Internet Explorer无法显示网页”。这是IIS限制吗?我应该使用短划线或下划线而不是逗号吗?

8 个答案:

答案 0 :(得分:33)

据我所知,逗号在URL的文件名部分是允许的,但在域*中是保留字符。

您使用的是哪个版本的IE?我发现了IE5.5在逗号(link here上截断URL的奇怪报告,但是在IE7中用逗号测试了URL并且看起来没问题,所以如果有IE漏洞,那就不行了似乎还有 - 可能是IIS问题吗?

我想知道页面错误是否是由mod_rewrite规则失败引起的 - 您是否可以发布匹配多个ID的规则并将其传递给Foo.aspx?是否有可能只匹配Foo.N,N,并且没有更多逗号?

<小时/> *来自URI RFC

  

2.2。保留字符

     

许多URI包含由某些组成或由其分隔的组件      特殊字符。这些字符称为“保留”,因为      它们在URI组件中的使用仅限于它们的保留      目的。如果URI组件的数据与      保留的目的,然后必须转义冲突的数据      形成URI。

 reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","
     

上面的“保留”语法类指的是那些字符      在URI中允许,但在一个URI中可能不允许      通用URI语法的特定组件

答案 1 :(得分:25)

我记得默认情况下,Url Routing首先检查文件是否存在,并且逗号在文件名中不合法,这可能是您收到错误的原因。 IIS可能有遗留代码,在请求进入asp.net进行处理之前中止请求。

Scott Hanselman的blog post对此有所了解,可能对您有用。


作为一般性评论:网址重写通常用于使网址友好且易于记忆。

~/page.aspx?id=1,2,3,4既不比~/page/1-2-3-4.aspx更糟也更好:两者都难以使用,为什么要经过额外的努力呢?尽量避免创建新的网址表单。用户,服务台和其他开发人员只会感到困惑。

最好使用网址重写来转换

~/products/view.aspx?id=1
~/products/category.aspx?type=beverage

~/products/view/1
~/products/category/beverage

答案 2 :(得分:13)

尝试使用网址中的%2c替换逗号。

答案 3 :(得分:4)

除了ConroyP的答案之外,下面是对RFC的另一个引用。它注意到一些不安全的字符,但没有提到逗号(暗示逗号是安全的):

  

由于多种原因,角色可能不安全。空间   角色是不安全的,因为重要的空间可能会消失   当转录URL时,可能会引入无关紧要的空格   排版或受到文字处理程序的处理。   字符“&lt;”和“&gt;”是不安全的,因为它们被用作   自由文本中的URL分隔符;引号(“”“)用于表示   在某些系统中划分URL。字符“#”是不安全的,应该   总是被编码,因为它在万维网和其他网络中使用   用于从可能的片段/锚标识符界定URL的系统   跟着它。字符“%”是不安全的,因为它用于   其他角色的编码。其他角色不安全因为   已知网关和其他传输代理有时会修改   这样的人物。这些字符是“{”,“}”,“|”,“\”,“^”,“〜”,   “[”,“]”和“`”。

     

所有不安全的字符必须始终在URL中编码。对于   例如,字符“#”必须在URL中编码,即使在   通常不处理片段或锚点的系统   标识符,以便将URL复制到另一个系统中   确实使用它们,没有必要更改URL编码。

答案 4 :(得分:3)

根据规范允许在路径,查询字符串和片段中使用逗号。如果IE不符合规范,我不会感到惊讶。像Claudiu建议的那样尝试这个实体,但我不知道为什么这是必要的。

答案 5 :(得分:1)

接受多个ID的正确方法是这样的:

Foo.aspx?id=1;id=2;id=3;id=4;id=5

请注意,目标是什么。重新编写网址时,您可以在一定程度上设置自己的规则,以满足您希望源的外观。

我也必须在StackOverflow上学习这一点。看到这个问题:
Split out ints from string

答案 6 :(得分:1)

答案

问题在于逗号。我猜测IIS有问题(不是IE),因为IE能够在localhost上显示它。

无论如何,我只是将URL格式更改为此格式并且工作正常:

Foo.1-2-3-4-5.aspx

答案 7 :(得分:1)

如果您安装了前置控制器,那么您可以执行类似的操作;

index.aspx?c=Foo/1/2/3/4

Front Controller将获取方法名称和传递给它的参数。这是一种非常常见的技术。