Edit report at https://bugs.php.net/bug.php?id=64951&edit=1

 ID:                 64951
 Comment by:         a dot panek at brainsware dot org
 Reported by:        a dot panek at brainsware dot org
 Summary:            SCRIPT_NAME acts strange
 Status:             Not a bug
 Type:               Bug
 Package:            Built-in web server
 Operating System:   Linux & Windows
 PHP Version:        5.4.15
 Assigned To:        ab
 Block user comment: N
 Private report:     N

 New Comment:

Oh and what I forgot to mention: I currently can't use __FILE__ because the 
code 
using SCRIPT_NAME is not in the actual index.php (aka router script) but in 
another part of the framework.

The actual index.php also doesn't have any code besides the composer autoloader 
and the framework "boot" script being required.


Previous Comments:
------------------------------------------------------------------------
[2013-06-03 12:28:51] a dot panek at brainsware dot org

1) I am using the router script according to the example in the documentation: 
http://php.net/manual/en/features.commandline.webserver.php#example-381 
("Example #4 Checking 
for CLI Web Server Use", "To reuse a framework router script during development 
with the CLI 
web server and later also with a production web server:")

This implies that I can reuse my current index.php, put in checks whether a 
file exists, and 
keep the rest as-is. I can't do this right now because SCRIPT_NAME doesn't 
behave as-is, but 
instead as if I had Apache + mod_rewrite enabled - as you said. I can't seem to 
find that 
behaviour documented anywhere?

That seems like either a bug in the documentation or the server.

2) If my router script is not called "index.php" but something else, 
SCRIPT_NAME *always* holds 
the URI instead of the actual script path. I haven't seen that documented 
either. (And it feels 
wrong to have that behaviour without any documentation about it)

3a) If I do not use a router script and try to access a URI with a file 
extension (like 
/something.json), the server always returns a 404 if given URI doesn't point to 
an actual file.

Even if this is not considered a bug, it's not good to be that unpredictable.

------------------------------------------------------------------------
[2013-06-03 07:29:40] a...@php.net

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Using the router script in the command line is the same as using mod_rewrite 
with apache, basically something like this

RewriteEngine On
RewriteRule ^/hellou$ /hello.php [L]

is equivalent to

php -S localhost:8080 -t. hello.php

With this, requesting /hellou under apache will result 
$_SERVER['SCRIPT_NAME'] => /hellou
__FILE__ => full path to hello.php


If you ommit the router script, you'll get the apache behaviour without 
mod_rewrite. To do so, in your example 

php -S localhost:8080 -t.

The current document root will be like a normal htdocs with apache.

------------------------------------------------------------------------
[2013-05-31 07:28:09] a dot panek at brainsware dot org

Description:
------------
When sending a request that has a file extension OR the request doesn't go to a 
index.php (a test.php, e.g.), the SCRIPT_NAME holds the URI instead of the 
actual 
current script name as documented here 
http://php.net/manual/en/reserved.variables.server.php

"Contains the current script's path. This is useful for pages which need to 
point 
to themselves. The __FILE__ constant contains the full path and filename of the 
current (i.e. included) file."

So basically the built-in server doesn't act as documented except when you use 
a 
file called "index.php" as router script and don't use a file extension in your 
URI.

I tested this on Linux and Windows resulting in the exact same behaviour.

Test script:
---------------
<?php
# index.php
#
# php -S localhost:8080 -t. index.php
#
# curl -i -X GET -H 'Accept: application/json' localhost:8080/something.json
# -> '/something.json'
# curl -i -X GET -H 'Accept: application/json' localhost:8080/something
# -> '/index.php
#
# php -S localhost:8080 -t. test.php
# -> always the uri

echo $_SERVER['SCRIPT_NAME'];

?>

Expected result:
----------------
/index.php

Actual result:
--------------
/something.json


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=64951&edit=1

Reply via email to