如何将 nginx 请求重定向到不同的路径

How to redirect nginx request to different path

这是我的 nginx.conf,它服务于 example.com/srv/phabricator/phabricator/webroot/index.php 的任何请求.我想更改功能,以便如果 example.com/test 收到请求,则 /home/phragile/public/index.php 得到服务。

daemon off;
error_log stderr info;
worker_processes  1;
pid        /run/nginx.pid;

events {
    worker_connections  4096;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    client_max_body_size  200M;
    client_body_buffer_size 200M;

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream websocket_pool {
        ip_hash;
        server 127.0.0.1:22280;
    }

    server {
        listen       *:80;

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

        root /srv/phabricator/phabricator/webroot;
        try_files $uri $uri/ /index.php;

        location /.well-known/ {
            root /srv/letsencrypt-webroot;
        }

        location / {
            index index.php;

            if ( !-f $request_filename )
            {
                rewrite ^/(.*)$ /index.php?__path__=/ last;
                break;
            }
        }

        location /index.php {
            include /app/fastcgi.conf;
            fastcgi_param PATH "/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/bin";
            fastcgi_pass 127.0.0.1:9000;
        }

        location = /ws/ {
            proxy_pass http://websocket_pool;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 999999999;
        }
    }
}

我尝试了以下方法,但没有用:

location /test {
     root /home/phragile/public;
}

有人可以告诉我需要在 .conf 文件中添加什么吗?

您需要使用 alias 而不是 root,因为您正试图将 /test 映射到 /home/phragile/public,而后者并不以前者结尾。有关更多信息,请参阅 this document。您还需要在该位置执行 PHP(请参阅您的 location /index.php 块)。

您有一个非常特殊的配置,旨在仅执行一个 PHP 文件。 /test 的通用解决方案可能如下所示:

location ^~ /test {
    alias /home/phragile/public;
    if (!-e $request_filename) { rewrite ^ /test/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include /app/fastcgi.conf;
        fastcgi_param PATH "/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/bin";
        fastcgi_pass 127.0.0.1:9000;

        fastcgi_param  SCRIPT_FILENAME $request_filename;
    }
}

我已经粘贴了您现有的 FastCGI 指令(我认为它对您有用)并为 SCRIPT_FILENAME 添加了所需的值(假设您使用的是 php_fpm 或类似的)。

当然,如果/test下没有静态内容,可以大大简化。