1

我有这个htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((.|\r|\n)+)/? index.php?params=$1 [L,NC]

它允许我向 index.php 发送无限的参数,并在 params 数组中接收它们。允许换行符 ('\r' / '\n')。

我遇到的问题是,当我发送server/param1/param2/param3时, $_GET['params'] 看起来像:

Array ( [0] => param1 [1] => param2 [2] => param3 )

但是我发送server/param1//param3, $_GET['params'] 错过了一个键:

Array ( [0] => param1 [1] => param3 )

我希望服务器回答一个空值,而不是一个已删除的键:

Array ( [0] => param1 [1] => [2] => param3 )
4

3 回答 3

1

这是无法做到的。原因是RFC 1738,它定义了 URL 的语法。HTTP URL 的定义如下:

; HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]

这意味着在 HTTP 路径中,不允许使用双斜杠(空 hsegment)。这就是 HTTP 服务器简单地将 URL 路径中的双斜杠解释为一个斜杠的原因。

于 2013-08-13T09:40:13.510 回答
0

我相信这种在没有实际参数名称的情况下拥有无限数量的参数的方法将来可能会引起混淆,请看以下示例:

server/param1//param3/param4///param5/param6////param7

您的代码解析这些参数并验证哪个参数已经很复杂,我强烈建议您使用命名参数。

于 2013-08-13T09:43:35.793 回答
0

问题是您在这里拥有它的规则。请检查我对您发布的其他问题的回答,这不会导致此问题,因为它不会像您遇到的那样将多个截断//为单个,因为从./RewriteRule

试试这个代码:

RewriteCond %{QUERY_STRING} !^params=.+ [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+[^/]+/([^\s]+) [NC]
RewriteRule ^ index.php?params=%1 [L,QSA]
于 2013-08-13T10:14:27.097 回答