【问题标题】:Allow empty query string in .htaccess (like server/param1//param3/)允许 .htaccess 中的空查询字符串(如 server/param1//param3/)
【发布时间】:2013-08-13 09:33:13
【问题描述】:

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

【问题讨论】:

  • $_GET['params'] 只是作为一个字符串。你是在调用explode让它变成一个数组吗?
  • 没错,$_GET['params'] 像 param1/param2 一样出现,所以是的,我做了一个爆炸 ;)

标签: php apache .htaccess mod-rewrite


【解决方案1】:

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

; HTTP

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

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

【讨论】:

  • 我已经看到它在 IIS 内部启用,所以尽管它是不允许的,但它是可能的 - 我只是不知道如何在 Apache 内部实现它;)跨度>
  • 我们都知道微软喜欢定义自己的标准,但我很确定 Apache 会遵守这些标准。我敢打赌你不能用 Apache 做到这一点。
  • 关于 MS 的真实故事就在那里。但是,我不一定需要 // 才能工作。我只想拥有空数据而不是没有数据。也许有一种方法可以让 .htaccess 重写 // 到 /_/ 如下所述?
  • 你赌什么?查看@anubhava 的答案;)!有可能;)
  • 所以这是可能的,但它仍然违反标准以及所有美好和神圣的东西。
【解决方案2】:

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

试试这个代码:

RewriteCond %{QUERY_STRING} !^params=.+ [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+[^/]+/([^\s]+) [NC]
RewriteRule ^ index.php?params=%1 [L,QSA]

【讨论】:

  • 谢谢!这确实有效!您的其他答案导致系统所在目录出现问题,这个问题就像一个魅力。
  • 其他答案也应该可以,我只是不知道您的网址在/param1/param2/param3 之前也有一个目录。我也修改了这个答案以使其工作,所以基本上两个答案都是相同的:)
  • 请记住,将来如果您想要“原样”原始 URL,请不要从 RewriteRule 获取匹配项。 %{THE_REQUEST} 是捕获原始未修改 URL 段的最佳方式。
【解决方案3】:

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

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

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

【讨论】:

  • 名字出现在我的脚本中。我正在构建某种 REST 服务器来将 iOS 应用程序连接到后台。第一个参数始终是被调用的方法。在方法内部,所有参数都有自己的用途。
  • 如前所述,不可能有双斜杠,但您可以执行server/param1/something/param2/_/param3/somethingelse 之类的操作,这会强制执行正确的参数类型并更好地控制发送到类似 REST 的服务的内容。您只需要稍微重写.htaccess 文件。
  • 有没有办法将//重写为/_/呢?
猜你喜欢
  • 2014-09-02
  • 2015-02-06
  • 1970-01-01
  • 2015-12-10
  • 2015-01-03
  • 2013-05-14
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多