如何将 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
下没有静态内容,可以大大简化。
这是我的 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
下没有静态内容,可以大大简化。