在服务器模式下(不是FastCGI)总是将HHVM所有请求发送到同一文件的任何方法?

时间:2016-11-27 20:55:03

标签: php nginx hhvm

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

  • nginx / apache接收请求并将其传递给幕后的index.php到hhvm vi FastCGI。
  • 通过FastCGI进行切换后,$_SERVER['SCRIPT_NAME']始终为index.php$_SERVER['REQUEST_URI']来自网址/path/to/resource(通知,无index.php位于它)
  • 我在/some/path/public/index.php中有一个index.php文件的框架
  • 所有请求都转到index.php并且路由系统解析了它们的URI(在本例中为`/ path / to / resource)。
  • 处理请求的实际代码在形式上与URI没有结构关系(即没有/path/to/resource/index.php)

为了在运行hhvm用于开发目的或只是有趣时将nginx或apache从图片中取出,我在服务器模式下运行hhvm( NOT FastCGI模式!!! ):

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

但是,框架不能优雅地处理路径中的index.php。当hhvm在服务器模式下运行时,唯一有效的URL是:

 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?是否可以通过选项标志/设置显式设置SCRIPT_NAME?

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

  • SCRIPT_NAME = index.php
  • REQUEST_URI = /path/to/resource

2 个答案:

答案 0 :(得分:1)

好的,我想了几个方法,在另一个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/$1"
hhvm.virtual_host[default][rewrite_rules][common][qsa] = true

很难找到相关的文档,但这里有一个指向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

将这两者设置为您的默认索引/路由文件 - 让您的框架处理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现在有效。猜猜你不能吃蛋糕,也不能吃它。)

答案 1 :(得分:0)

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

一个例子是:

hhvm.server.global_document = index.hh

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