Нужно пользовательское регулярное выражение Nginx

Вот что я имею сейчас, и это работает, но нуждается в некотором улучшении. Я предполагаю, что мне нужно будет использовать регулярные выражения, и поэтому мне нужна помощь.

Что мне нужно это

http://www.example.com/filename/segment1/segment2/?argk=argv

перейти к этому:

http://www.example.com/filename.php/segment1/segment2/?argk=argv

Следующие работы без сегментов. index.php работает как положено

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

location ~ \.php$ {

    try_files $uri $uri/ /index.php?$args;

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #   fastcgi_intercept_errors on;
    fastcgi_pass  unix:/tmp/php.socket;
}

Материал, который я попробовал:

if (!-e $request_filename)
{
    rewrite ^/([^?]*[^?/])/?(\?.*)?$  /$1.php/$2  last;
    break;
}

    if (!-e $request_filename)
    {
        rewrite ^/([^./]+)/(.*) /$1.php/$2 last;
        break;
    }

2 ответа

location ~ ^(/[^/]+)(.*)$ {
    try_files $uri $1.php$2$is_args$args;
}

location ~ ^(.+\.php)(/.*)?$ {

    try_files $uri /index.php?$args;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$1;
    fastcgi_param SCRIPT_NAME $1;
    fastcgi_param PATH_INFO $2;

    #   fastcgi_intercept_errors on;
    fastcgi_pass  unix:/tmp/php.socket;
}

Вам понадобится rewrite директива от модуля перезаписи вместе с регулярным выражением для выполнения внутренней перезаписи пути. Как-то так внутри location / блок должен работать.

rewrite ^/([^./]+)/(.*) /$1.php/$2 last;

Вам также необходимо изменить регулярное выражение вашего PHP location блок для соответствия .php файлы в середине пути, так что-то вроде этого:

location ~ \.php(/|$)
Другие вопросы по тегам