有什么方法可以在服务器模式下始终将 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
:
- nginx/apache 接收请求并在后台将其传递给 index.php 到 hhvm vi FastCGI。
- 通过 FastCGI 切换后,
$_SERVER['SCRIPT_NAME']
始终是 index.php
而 $_SERVER['REQUEST_URI']
来自 url /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 在服务器模式下(不是 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
应该有:
- SCRIPT_NAME =
index.php
- REQUEST_URI =
/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_document
和 error_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
工作设置,假设请求 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']
来自 url/path/to/resource
(注意,没有index.php
任意位置) - 我在 /some/path/public/index.php 中有一个带有
- 所有请求都转到
index.php
并由路由系统解析它们的 URI(在本例中为 `/path/to/resource)。 - 处理请求的实际代码在形式上与 URI 没有结构关系(即没有 /path/to/resource/index.php)
index.php
文件的框架
为了在 运行出于开发目的或只是为了好玩而使用 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
应该有:
- SCRIPT_NAME =
index.php
- REQUEST_URI =
/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_document
和error_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