工作设置,假设请求http://127.0.0.1:8080/path/to/resource
:
$_SERVER['SCRIPT_NAME']
始终为index.php
,$_SERVER['REQUEST_URI']
来自网址/path/to/resource
(通知,无index.php
位于它)index.php
文件的框架index.php
并且路由系统解析了它们的URI(在本例中为`/ path / to / resource)。 为了在运行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
会:
index.php
/path/to/resource
答案 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_document
和error_document404
将相对于此目录,除非它们具有完全限定的路径。但是,您必须明确地将error_document404
设置为某个内容。虽然default_document
似乎默认为index.php
,但error_document404
似乎没有默认值。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