【发布时间】:2017-11-09 22:32:06
【问题描述】:
我有一个用 PHP 编码的服务器管理页面,其中一项功能是更改访问管理页面的端口。这是通过自调用形式 POST 方法中的数字 <input> 字段完成的。单击提交按钮时,代码将输入的数字作为要使用的端口号写入服务器的 Nginx 配置文件,然后运行命令重新启动 Nginx:
exec('sudo service nginx restart > /dev/null &');
问题是当这个命令运行时,Firefox 会抛出一个内容错误。我试图解决这个问题,改用这段代码:
$newAPort = $_POST['admin-port'];
header('Content-Length: 0');
// Restart Nginx
exec('sudo service nginx restart > /dev/null &');
sleep(15);
$newURL = 'http://'.$_SERVER[HTTP_HOST].':'.$newAPort;
header('Location: '.$newURL);
这是一些进步,Firefox 错误现在是“无法连接”,并且错误显示带有旧端口号的 URL。如何正确重定向到新端口?我以为上面的代码块可以做到,但事实并非如此。
【问题讨论】:
-
旁注:如果
$_SERVER[HTTP_HOST]没有显示通知,则表示您正在编写禁用错误报告的 PHP。这使得它比它应该的更难。 -
您期望由 Web 服务器启动的 PHP 脚本在 Web 服务器之间重新启动后仍然执行......?我认为这根本不可能。
-
@Alvaro - 好点,但直到今天(即将交付给客户)我有错误报告并且没有通知。通知应该是什么?
-
通知应该是 “注意:使用未定义的常量 HTTP_HOST - 在 [...] 中假定为 'HTTP_HOST'” 除非您自己在某处实际定义了名称为 HTTP_HOST 的常量。
-
“有人告诉我,一些防火墙管理页面会启用端口更改,并在延迟后使用该端口” – 我仍然怀疑他们是否能做到这一点way ... // 我可能会先向客户端返回一个完整的 HTML 文档,可能是close the connection,然后重新启动 Web 服务器。您之前输出的所述 HTML 文档将包含元刷新,以使浏览器在 X 秒后使用新端口请求新地址 ...