Nginx位置指令似乎没有工作。 我错过了什么吗?

我将Nginx设置为我的主要Web服务器,并在其后面有两个基于Mochiweb的服务器。 某些请求被反向代理到这两个服务器。 现在,我想使用nginx来访问phpmyadmin(位于/ var / www / nginx-default / phpMyAdmin),但是它一直说错误404没有find。 我在这里错过了很明显的东西吗

server { ############### General Settings #################### listen 80; server_name localhost; access_log /home/me/dev/wwwaccess.log; ############## Document Root ####################### location / { root /home/me/dev; index index.html index.htm index.php; } ############## PHPMyAdmin ####################### location /phpmyadmin { root /var/www/nginx-default/phpMyAdmin; index index.html index.htm index.php; } ############## Proxy Settings for FastCGI Server ##### location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/me/dev$fastcgi_script_name; include /etc/nginx/fastcgi_params; } ############# Proxy Settings for Mochi1 ############### location /mochi1 { proxy_pass http://127.0.0.1:8000; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 3600; proxy_buffering off; } ############# Proxy Settings for Mochi2 ############### location /mochi2 { proxy_pass http://127.0.0.1:8001; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 3600; proxy_buffering off; } ############# Error redirection pages ################ error_page 500 502 503 504 /50x.html; location = /50x.html { root /home/me/dev; } } 

这里的问题是,只有“最佳”的location指令才会按照以下顺序进行:

 location = <path> (longest match wins) location ^~ <path> (longest match wins) location ~ <path> (first defined match wins) location <path> (longest match wins) 

使用这个规则集,你的/phpmyadmin location指令被正则expression式“ .php$location指令打出来,所以前者被完全忽略。 另外,你的php fastcgi指令被硬连线到你的/home/me/dev目录,这意味着phpMyAdmin是完全无法访问的。 您可以使用重写来为您的phpMyAdmin脚本获取正确的根:

 location ~ \.php$ { set $php_root /home/me/dev; if ($request_uri ~* /phpmyadmin) { set $php_root /var/www/nginx-default/phpMyAdmin; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $php_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } 

直接设置“root”。 更less的指令,更less的计算需要设置更多的variables。 还有其他的东西(如fastcgi_param DOCUMENT_ROOT)在当前接受的答案中不会被正确设置。 这个方法将会处理所有这些:

 location ~ \.php$ { if ($request_uri ~* /phpmyadmin) { root /var/www/nginx-default/phpMyAdmin; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include /etc/nginx/fastcgi_params; } 

我现在挣扎了好几个小时,上面讨论的解决scheme没有一个适用于我的情况(因为我需要运行index.php,index.php以及其他php脚本,而不是index.php),但是最终达到了工作configuration如下所示:

  location /php-app { passenger_enabled off; alias /path/to/php-app/$1; index index.php index.html; try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^/php-app(.*)$ /index.php?q=$1 last; } location ~ \.php$ { alias /path/to/php-app/$1; rewrite ^/php-app(.*)$ $1 last; passenger_enabled off; fastcgi_pass unix:/tmp/php-fpm.socket; fastcgi_index index.php; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /path/to/php-app$fastcgi_script_name; fastcgi_intercept_errors on; } 

也许它searchindex.html? 尝试改变

 location /phpmyadmin { root /var/www/nginx-default/phpMyAdmin; index index.php; } 

并在下面添加部分,以避免与案例相关的问题

 location /phpMyAdmin { rewrite ^/* /phpmyadmin last; }