是否可以在 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?的主要内容,如果未能解决你的问题,请参考以下文章

在 wordpress 中启用 CORS

在标题(php)中启用CORS不能在wordpress网站上运行[重复]

在 php 文件上启用了 Cors,但仍然出现错误

在 Domino 9.0.1 FP 10 中启用/配置 CORS

如何在自托管的 maptiler-server 中启用 CORS?

已被 CORS 策略阻止:没有“访问控制允许来源”