Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP built in server and .htaccess mod rewrites

Does PHP's built in server not make use of .htaccess? Makes sense, I suppose, as it isn't relying upon Apache(?). Anyway, is it possible to tell the server to make use of these files - can it handle URL rewrites? I have some projects in frameworks that rely upon these files.

APPLICATION_ENV=development php -S localhost:8000 -t public/

like image 256
Martyn Avatar asked Dec 09 '14 14:12

Martyn


2 Answers

Here's the router that I use for the builtin php webserver that serves assets from the filesystem if they exist and otherwise performs a rewrite to an index.php file.

Run using:

php -S localhost:8080 router.php 

router.php:

<?php  chdir(__DIR__); $filePath = realpath(ltrim($_SERVER["REQUEST_URI"], '/')); if ($filePath && is_dir($filePath)){     // attempt to find an index file     foreach (['index.php', 'index.html'] as $indexFile){         if ($filePath = realpath($filePath . DIRECTORY_SEPARATOR . $indexFile)){             break;         }     } } if ($filePath && is_file($filePath)) {     // 1. check that file is not outside of this directory for security     // 2. check for circular reference to router.php     // 3. don't serve dotfiles     if (strpos($filePath, __DIR__ . DIRECTORY_SEPARATOR) === 0 &&         $filePath != __DIR__ . DIRECTORY_SEPARATOR . 'router.php' &&         substr(basename($filePath), 0, 1) != '.'     ) {         if (strtolower(substr($filePath, -4)) == '.php') {             // php file; serve through interpreter             include $filePath;         } else {             // asset file; serve from filesystem             return false;         }     } else {         // disallowed file         header("HTTP/1.1 404 Not Found");         echo "404 Not Found";     } } else {     // rewrite to our index file     include __DIR__ . DIRECTORY_SEPARATOR . 'index.php'; } 
like image 160
Caleb Avatar answered Sep 22 '22 23:09

Caleb


It is not possible to handle .htaccess using PHP's built-in webserver (it is not relying on apache, it is implemented entirely in PHP's core). However, you can use router script (described here: http://php.net/manual/en/features.commandline.webserver.php).

E.g. php -S localhost -S localhost:8080 router.php

like image 29
Agares Avatar answered Sep 21 '22 23:09

Agares