我通常使用网址重写将内容ID传递给我的网站,所以
Foo.1.aspx
重写
Foo.aspx?id=1
对于特定的应用程序,我需要将多个ID传递给单个页面,所以我重写了一些事情来接受这个:
Foo.1,2,3,4,5.aspx
这在Cassini(Visual Studio的内置临时Web服务器)中运行良好,但是当我在运行IIS的实时服务器上尝试时,它给了我“Internet Explorer无法显示网页”。这是IIS限制吗?我应该使用短划线或下划线而不是逗号吗?
答案 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将获取方法名称和传递给它的参数。这是一种非常常见的技术。