是否可以在 PHP CLI 服务器中启用 CORS?
Posted
技术标签:
【中文标题】是否可以在 PHP CLI 服务器中启用 CORS?【英文标题】:Is it possible to enable CORS in the PHP CLI server? 【发布时间】:2015-06-19 11:21:12 【问题描述】:是否可以在php CLI server 中启用 CORS(如果可以,如何启用)?
编辑:要解决 cmets,例如我应该在我的脚本中包含标题,请注意我的代码中没有任何 PHP 文件/脚本。我只是将 PHP CLI 服务器用作轻量级本地托管选项。因此,理想情况下,答案将提供 CLI 选项,或者表明没有。
【问题讨论】:
与任何其他服务器的方式相同,因为您在脚本中发出 CORS 标头。 @Sammitch 查看我的编辑 如果您不使用该服务器提供 PHP 脚本,那么您将无法控制发送哪些标头。要启用 CORS,您必须发送Access-Control-Allow-Origin
标头。如果您不能使用 PHP,则无法发送标头。如果可以使用 PHP,则可以发送标头。就是这样。
【参考方案1】:
使用 php 路由脚本在 webhook 文件夹中使用 DocumentRoot 启动服务器:
php -S localhost:8888 -t webhook webhook/dev-routings.php
webhook/dev-routings.php:
<?php
// Copyright Monwoo 2017, service@monwoo.com
// Enabling CORS in bultin dev to test locally with multiples servers
// used to replace lack of .htaccess support inside php builting webserver.
// call with :
// php -S localhost:8888 -t webhook webhook/dev-routings.php
$CORS_ORIGIN_ALLOWED = "http://localhost:3000"; // or '*' for all
function consoleLog($level, $msg)
file_put_contents("php://stdout", "[" . $level . "] " . $msg . "\n");
function applyCorsHeaders($origin)
header("Access-Control-Allow-Origin: $origin");
header("Access-Control-Allow-Credentials: true");
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Accept');
if (preg_match('/\.(?:png|jpg|jpeg|gif|csv)$/', $_SERVER["REQUEST_URI"]))
consoleLog('info', "Transparent routing for : " . $_SERVER["REQUEST_URI"]);
return false;
else if (preg_match('/^.*$/i', $_SERVER["REQUEST_URI"]))
$filePath = "$_SERVER['DOCUMENT_ROOT']/$_SERVER["REQUEST_URI"]";
applyCorsHeaders($CORS_ORIGIN_ALLOWED);
if (!file_exists($filePath))
consoleLog('info', "File not found Error for : " . $_SERVER["REQUEST_URI"]);
// return false;
http_response_code(404);
echo "File not Found : $filePath";
return true;
$mime = mime_content_type($filePath);
// https://***.com/questions/45179337/mime-content-type-returning-text-plain-for-css-and-js-files-only
// https://***.com/questions/7236191/how-to-create-a-custom-magic-file-database
// Otherwise, you can use custom rules :
$customMappings = [
'js' => 'text/javascript', //'application/javascript',
'css' => 'text/css',
];
$ext = pathinfo($filePath, PATHINFO_EXTENSION);
// consoleLog('Debug', $ext);
if (array_key_exists($ext, $customMappings))
$mime = $customMappings[$ext];
consoleLog('info', "CORS added to file $mime : $filePath");
header("Content-type: $mime");
echo file_get_contents($filePath);
return true;
else
consoleLog('info', "Not catched by routing, Transparent serving for : "
. $_SERVER["REQUEST_URI"]);
return false; // Let php bultin server serve
【讨论】:
导致错误目录 webhook 不存在。【参考方案2】:对于那些仍在为此摸不着头脑的人,我遇到了同样的问题并解决了。对我来说,从 Webpack 开发服务器代理到我的 PHP 开发服务器不起作用。
当您使用 localhost 作为服务器时,PHP 内置服务器似乎存在 CORS 问题。相反,您应该使用本地 IP 地址,或仅使用 127.0.0.1,它再次指向您的本地计算机。所以,你会像这样启动你的服务器:
php -S 127.0.0.1:8888 -t public
现在 Webpack 开发服务器代理可以工作了。您也可以使用 0.0.0.0。希望这可以帮助。
【讨论】:
【参考方案3】:此功能未在内部 Web 服务器中实现。 Web 服务器仅用于基本测试,而不用于生产。请注意documentation顶部的红色框:
警告
此网络服务器旨在帮助应用程序开发。它也可用于测试目的或在受控环境中运行的应用程序演示。它并非旨在成为功能齐全的 Web 服务器。它不应该在公共网络上使用。
【讨论】:
你告诉过:I am simply using the PHP CLI server as a lightweight local hosting option.
。我认为手册说明了一切
我没有投反对票。别人做了。如果您声称的文档中没有任何内容,我将接受修改后的答案,尽管只是在稍等片刻之后,看看是否有人知道无证支持
另外,更清楚地说,您现在的回答并没有表明该功能没有实现 - 它可能只是表明它没有记录。
我编辑了那个。在阅读了文档顶部的 red 框之后,我仍然想知道为什么您会期待这样的功能。此外,通常手册确实会提及已实施的内容,但不会提及未实施的内容。
基本测试应该包括CORS,基本测试CORS。从源“localhost:3000”访问“localhost:8400/resources/Auth.postman_collection.json”处的 XMLHttpRequest 已被 CORS 策略阻止。所以是的......拒绝回答。以上是关于是否可以在 PHP CLI 服务器中启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章
在标题(php)中启用CORS不能在wordpress网站上运行[重复]
在 Domino 9.0.1 FP 10 中启用/配置 CORS