Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Override PHP server variables like REQUEST_URI #1077

Open
mqudsi opened this issue Jan 20, 2024 · 1 comment
Open

Override PHP server variables like REQUEST_URI #1077

mqudsi opened this issue Jan 20, 2024 · 1 comment
Labels
z-php Language-Module for PHP (SAPI)

Comments

@mqudsi
Copy link

mqudsi commented Jan 20, 2024

I've used nginx-unit for standalone php servers in the past with great success so I decided to try and move a rather large production configuration of nginx + php-fpm to nginx + nginx-unit (php) but ran into what seems to be a limitation in the design. It seems that while nginx-unit supports sitting behind nginx, it doesn't really cater for cases where nginx is performing redirects for the app because it expects that php's $_SERVER['REQUEST_URI'] will come from $request_uri.

In this case, because I am porting a php-fpm installation to nginx-unit, nginx has already rewritten "virtual urls" to the actual document url. I thought I could use proxy_set_header X-Request-Uri $request_uri; in nginx to make a variable $header_x_request_uri available to nginx-unit and then configure nginx-unit to tell php to use $header_x_request_uri as REQUEST_URI but this does not seem possible (the only options are script and index?).

In an nginx + php-fpm installation, the nginx fastcgi_param directive can be used to set the following variables:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

but there doesn't seem to be any way to do the same in nginx-unit?

@tippexs tippexs added the z-php Language-Module for PHP (SAPI) label Jan 31, 2024
@scheibling
Copy link

scheibling commented Mar 20, 2024

If you set X_REQUEST_URI in nginx (proxy), unit should forward that to PHP as-is, meaning you could easily make the first line in your index.php-file:

<?php
$_SERVER['REQUEST_URI'] = $_SERVER['X_REQUEST_URI'];

// Start app here

Or just adjust the app to use X_REQUEST_URI instead

Edit: Alternatively, you could restore the original path with routes and NJS, see https://unit.nginx.org/scripting/, e.g.:

{
"routes": {
"parse": [
        {
            "action": {
                "rewrite": "`${ headers['X-Request-Path'] }`",
                "pass": "routes/my-route"
            }
        }
    ]
}}

Alternatively, to just adjust the URL and then move on to the next rule

{
"routes": {
"parse": [
        {
            "action": {
                "rewrite": "`${ headers['X-Request-Path'] }`",
                "pass": "routes"
            }
        }
    ]
}}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
z-php Language-Module for PHP (SAPI)
Projects
None yet
Development

No branches or pull requests

3 participants