php – How to get PATH_INFO in Nginx when using rewrite (friendly url)?


I created a .htaccess in /var/www/project/ folder:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteCond $1 !^(statics/([a-zA-Z0-9\-\/.]+)|index\.php)$ #ignora a pasta /statics
    RewriteRule ^([a-zA-Z0-9\-\/.]+)$ index.php/$1 [QSA,L] #Adiciona PATH_INFO

<Files *.php>
    Order Deny,Allow
    Deny from all

<Files index.php>
    Order Allow,Deny
    Allow from all


echo 'Path: ', $_SERVER['PATH_INFO'];

When I access http://localhost/project/profile , index.php returns this:

Path: /profile

The problem is trying to do this in Nginx. I tried this:

location ~ ^/project/(?!index\.php|statics/|data/)([a-zA-Z0-9\-\/.]+)$ {
    rewrite  ^(/project/)([a-zA-Z0-9\-\/.]+)$  $1/index.php/$2 break;
    return 500;

location ~ [^/]\.php(/|$) {
    #fastcgi_split_path_info ^(.+?\.php)(/.*)$;

    #if (!-f $document_root$fastcgi_script_name) {
    #    return 404;

    fastcgi_index index.php;
    include fastcgi_params;

But when I open http://localhost:8000/project/profile it shows 404 Not Found .

How can I make nginx work like .htaccess?


For it to work it is necessary to use last no rewrite and fastcgi_split_path_info to configure the PATH_INFO , example:

Note: Use the full path in rewrite and in location

location ~ ^/project/(?!index\.php/.*|index\.php$|statics/.*|data/.*)([a-zA-Z0-9\-\/.]+)$ {
    rewrite ^/project/(?!index\.php/.*|statics/.*|data/.*)([a-zA-Z0-9\-\/.]+)$ /project/index.php/$1 last;

location ~ ^/project/(?!index\.php).*\.php$ {
    deny all;

location ~ [^/]\.php(/|$) {
    # Configura PATH_INFO
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;

    fastcgi_index index.php;
    include fastcgi_params;
Scroll to Top