允许.htaccess中的空查询字符串(如server / param1 // param3 /)

时间:2013-08-13 09:33:14

标签: php apache .htaccess mod-rewrite

我有这个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 )

3 个答案:

答案 0 :(得分:1)

这不可能。 原因是RFC 1738,它定义了URL的语法。 HTTP URL定义如下:

; HTTP

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

问题是你在这里遵守的规则。在我发布的其他问题上查看我的答案,这不会导致此问题,因为由于从{{1}捕获的字符串,您不会因为遇到问题而将多个//截断为单个/ }。

试试这段代码:

RewriteRule