有什么方法可以在服务器模式下始终将 HHVM 所有请求发送到同一文件(不是 FastCGI)?

Any way to always send HHVM all request to same file in server mode (not FastCGI)?

工作设置,假设请求 http://127.0.0.1:8080/path/to/resource:

为了在 运行出于开发目的或只是为了好玩而使用 hhvm 时,为了将 nginx 或 apache 排除在外,我 运行 hhvm 在服务器模式下(不是 FastCGI 模式!!!):

cd /some/path/public/
hhvm -m server -p 8080

但是,框架没有妥善处理路径中的 index.php。当 hhvm 运行ning 在服务器模式下提供服务时,唯一可用的 urls 是:

 http://127.0.0.1:8080/index.php
 ...or...
 http://127.0.0.1:8080

任何更复杂的失败,如:

http://127.0.0.1:8080/path/to/resource  (HHVM fails, file not found)

此外,坚持显式 index.php 会失败,因为框架无法妥善处理 REQUEST_URI 中的 index.php

http://127.0.0.1:8080/index.php/path/to/resource  (HHVM works, but framework fails, `index.php` in uri confuses it)

有谁知道在所有请求都发送到根目录 /some/path/public/index.php 的情况下如何让它工作的方法?是否有通过选项 flag/setting 显式设置 SCRIPT_NAME 的选项?

理想情况下,请求 http://127.0.0.1:8080/path/to/resource 应该有:

好的,我想到了一些方法,运行在另一位 SO 用户的帮助下安装 HHVM 3.18.1。

最好的方法是使用虚拟主机重写规则:

hhvm.server.default_document = index.php

hhvm.virtual_host[default][rewrite_rules][common][pattern] = "(.*)"
hhvm.virtual_host[default][rewrite_rules][common][to] = "index.php/"
hhvm.virtual_host[default][rewrite_rules][common][qsa] = true

很难找到这方面的文档,但这里有一个 link 对 HHVM 文档的解释:https://docs.hhvm.com/hhvm/configuration/INI-settings#server-mode__virtual-host-format

请注意,文档是旧格式,而不是新的 ini 格式,因此选项名称应从 CamelCase 转换为下划线分隔,如 camel_case.

另一种不太优雅的方式: 不使用重写,您可以劫持 404。您需要设置 BOTH 参数

  • hhvm.server.error_document404
  • hhvm.server.default_document

将这两个设置为您的默认 index/routing 文件——让您的框架处理 404 消息。

您可以在 ini 配置文件中设置这些(我称之为 server.ini):

 hhvm.server.default_document = /path/to/index.php
 hhvm.server.error_document404 = /path/to/index.php

然后你可以启动服务器:

 hhvm -m server  -p 8080  -c /path/to/server.ini

你也可以跳过INI文件,在启动HHVM时传入详细信息:

 hhvm -m server -p 8080 -d  hhvm.server.default_document=/path/to/index.php -d hhvm.server.error_document404=/path/to/index.php

如果您不想运行 hhvm来自特定文件夹,您还可以设置:

hhvm.server.source_root=/path/to/doc_root

备注:

  • 如果设置此项,则 default_documenterror_document404 将相对于此目录,除非它们具有完全限定的路径。但是,您必须明确设置 error_document404 。虽然 default_document 似乎默认为 index.php,但 error_document404 似乎没有默认值。
  • 在 url 中明确包含 index.php(除非它是单独的)失败。这意味着:http://127.0.0.1:8080/index.php/path/to/resource 失败但 http://127.0.0.1:8080/path/to/resource 现在有效。猜猜你不能吃你的蛋糕也吃它:)

从 HHVM 4.26 开始,您可以使用 server.ini 中的 hhvm.server.global_document 设置。

例如:

hhvm.server.global_document = index.hh

现在所有请求都将通过 index.hh