La directive sur l'emplacement de Nginx ne semble pas fonctionner. Est-ce que je manque quelque chose?
-
06-07-2019 - |
Question
J'ai configuré Nginx en tant que serveur Web principal et possède deux serveurs basés sur Mochiweb. Certaines demandes sont inversées par proxy vers ces deux serveurs. Maintenant, je veux accéder à phpmyadmin (situé dans / var / www / nginx-default / phpMyAdmin) à l’aide de nginx, mais le message Erreur 404 n’a pas été trouvé. Est-ce que je manque quelque chose d'évident ici?
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;
}
}
La solution
Le problème ici est que seul le "meilleur" La directive location
est prise, dans cet ordre:
location = <path> (longest match wins)
location ^~ <path> (longest match wins)
location ~ <path> (first defined match wins)
location <path> (longest match wins)
En utilisant ce jeu de règles, votre directive / phpmyadmin
emplacement
est neutralisée par l'expression régulière "quot < .php $
". directive location
, la première est donc ignorée. De plus, votre directive php fastcgi est câblée dans votre répertoire / home / me / dev
, ce qui signifie que phpMyAdmin est totalement inaccessible. Vous pouvez utiliser une réécriture pour obtenir la racine correcte pour vos scripts 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;
}
Autres conseils
Définissez directement la 'racine'. Moins de directives, moins d’informatique nécessaire pour définir plus de vars. Il y a aussi d'autres choses (comme fastcgi_param DOCUMENT_ROOT) qui ne seront pas définies correctement dans la réponse actuellement acceptée. Cette méthode gèrera tout cela cependant:
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;
}
Je me débattais avec cela depuis des heures et aucune des solutions décrites ci-dessus ne fonctionnait dans mon cas (car j’avais besoin d’exécuter index.php, index.php avec arguments, et d’autres scripts php que index.php), mais a finalement atteint les configurations de travail comme suit:
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;
}
Peut-être qu'il recherche index.html? Essayez de changer pour
location /phpmyadmin {
root /var/www/nginx-default/phpMyAdmin;
index index.php;
}
et ajoutez la section ci-dessous pour éviter les problèmes liés aux cas
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}