nginxauraphp

AuraPHP router not picking up parameters


I'm trying to get the current version of the Aura router working with nginx.

I'm using the nginx config from the documentation and trying to get the closure route from https://github.com/auraphp/Aura.Router/blob/3.x/docs/getting-started.md working.

When I visit http://localhost:8080/blog/12 I get the message "You asked for blog entry 0.".

My nginx config looks like this:

 server {
      listen   80;
      root /code/public;
      index index.php index.html index.htm;
      server_name localhost;

      error_log  /var/log/nginx/error.log;
      access_log /var/log/nginx/access.log;

      location / {
          try_files $uri $uri/ /index.php?$args;
      }

      error_page 404 /404.html;

      location ~ \.php$ {

          fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
          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  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;

          fastcgi_pass php:9000;
          try_files $uri =404;
      }
  }

Solution

  • I don't think this has something to do with Aura.Router. The Aura.Router v 3.x under the hood uses Zend framework diactoros ( Nothing with Diactoros also :-) ).

    You can see how the matching is done : https://github.com/auraphp/Aura.Router/blob/a6897f8f66fe8b89d6ef0ab988ff77b5f77076ce/src/Matcher.php#L115

    It looks like there is some configuration issue at your end for nginx. Aura.Router is not an exception, so almost any configuration that works for Symfony, Slim etc should work with some slight changes. The configuration is copied from https://stackoverflow.com/a/23881325/487878 .

    This is what I tried.

    server {
        listen 80;
        server_name aurarouter.com;
        root /var/www/projects/aura-router-test;
        index index.php index.html index.htm;
    
        location / {        
            try_files $uri @rewriteapp;
        }
    
        location @rewriteapp {
            rewrite ^(.*)$ /index.php/$1 last;
        }
    
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
              return 404;
            }
            fastcgi_param  QUERY_STRING       $query_string;
            # copied from fastcgi_params, normally
            # include fastcgi_params;
            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;
            # copied from fastcgi_params
    
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
    
        location ~ /\.ht {
            deny all;
        }
    
    }
    

    So if you look carefully I think fastcgi_split_path_info is what seems missing at your end.

    Hope that helps.