Is it possible to enable CORS in the PHP CLI server (and if so, how)?
Edit: To address comments such as I should just include the header in my scripts, note that I do not have any PHP files/scripts in my code. I am simply using the PHP CLI server as a lightweight local hosting option. Thus ideally the answer will provide a CLI option, or show that there is none.
Start the server with DocumentRoot in webhook folder with php routings script :
php -S localhost:8888 -t webhook webhook/dev-routings.php
webhook/dev-routings.php :
<?php
// Copyright Monwoo 2017, [email protected]
// 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://stackoverflow.com/questions/45179337/mime-content-type-returning-text-plain-for-css-and-js-files-only
// https://stackoverflow.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
}