Назад | Перейти на главную страницу

Переписать url с помощью fastcgi в nginx

У меня есть рабочая конфигурация php fastcgi в nginx. Теперь у меня есть несколько запросов, таких как /X.php по /X, /Y.php по /Y Звучит просто, поэтому для тестирования я написал следующее:

rewrite ^/X.php$ /api/v1/stat last;

он был пойман обработчиком 404 приложения php. вот журнал ошибок nginx с rewrite_log на

[notice] 15289#0: *759 "^/X.php$" matches "/X.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
[notice] 15289#0: *759 rewritten data: "/api/v1/stat", args: "", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
[notice] 15289#0: *759 "^/X.php$" does not match "/index.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"

Если я захожу напрямую в / api / v1 / stat, он работает:

[notice] 15125#0: *708 "^/X.php$" does not match "/api/v1/stat", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com"
[notice] 15125#0: *708 "^/X.php$" does not match "/index.php", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com"

Вот моя связанная конфигурация nginx:

rewrite ^/X.php$    /api/v1/stat last;

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

location ~ .*\.php$ {
    try_files $uri =404;
    include        fastcgi_params;
    fastcgi_pass   php;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

upstream php {
    server unix:/var/run/php-fpm.sock;
}

Пожалуйста, помогите мне найти решение. Спасибо.

НОТА

Небольшая предыстория, которая может помочь вам понять мою проблему.

Вероятно, очевидно, что следующее должно работать, и оно работает:

rewrite ^/X.php$ /api/v1/stat permanent;

Однако я имею дело с каким-то оборудованием, которое не понимает перенаправление 301, поэтому я пытаюсь использовать внутреннее перенаправление, не показывая перенаправление.

ОБНОВЛЕНИЕ 1

Решение, которое я придумал, - это всего лишь половина. я получил /X.php перенаправить на /api/v1/stat хорошо. Однако после перенаправления нельзя передавать параметры. думаю rewrite пройдет по $args но это не работает. Я сейчас в растерянности ..

ОБНОВЛЕНИЕ 2

Задача решена. хотя я все еще не уверен, почему $args не проходит.

Включение режима отладки nginx и сравнение журнала рабочего запроса с неудавшимся дает мне ключ к разгадке: nginx для неудавшегося запроса REQUEST_URI переменная /X.php и не обновлялся даже после перезаписи. видеть nginx doc по переменным

Так что мне нужно обновить REQUEST_URI после переписывания. эта почта от SO помогает в этом.

Вот что мне подходит:

set $request_url $request_uri;
if ($request_uri ~ ^/X.php(.*)$ ) {
    set $request_url   /api/v1/x$1;
    rewrite ^/X.php    /api/v1/x  last;
}

location ~ .*\.php$ {
    try_files $uri =404;
    include        fastcgi_params;
    fastcgi_pass   php;
    fastcgi_index  index.php;

    fastcgi_param  REQUEST_URI        $request_url;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

ОБНОВИТЬ

наконец, это работает и со строкой запроса при перезаписи. Я добавил соответствующую строку запроса в if предложение и добавьте соответствующую строку запроса в request_url. задача решена.

перезаписать ^ / X.php $ / api / v1 / stat последним; отправляет вас в "место /"

например, вы можете использовать другое местоположение для сопоставления этого внутреннего перенаправления: "/ api / v1 / stat"

В этом месте вы можете передать запрос в fcgi-backend (или дополнительно изменить его в этом месте).