2016-07-23 9 views
0

У меня есть эта конфигурация для моего виртуального хоста:Почему дополнительное местоположение в nginx conf возвращает код 404?

server { 
    listen 80; 
    root /var/www/home; 
    access_log /var/www/home/access.log; 
    error_log /var/www/home/error.log; 

    index index.php index.html index.htm; 

    server_name home; 

    location/{ 
     try_files $uri $uri/ /index.php?$args; #if doesn't exist, send it to index.php 
    } 

    error_page 404 /404.html; 
    error_page 500 502 503 504 /50x.html; 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/run/php/php-fpm.sock; 

     fastcgi_index index.php; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param PHP_VALUE "error_log=/var/www/home/php_errors.log"; 
    } 

    location ~* /Admin { 
     allow 127.0.0.1; 
     deny all; 
    } 
} 

Когда я пытаюсь получить доступ к странице/Admin Nginx возвращает 404 кода с успешным содержанием HTML, порожденным PHP. Когда местоположение с/Admin удалено, все идет хорошо.

Как получить, в чем проблема с дополнительным местоположением?

ответ

1

Вы должны прочитать this document, чтобы понять порядок приоритетов различных видов блока местоположения.

Таким образом, вы можете разместить свое местоположение регулярок над location ~ \.php$ блоком, чтобы позволить ему иметь приоритет, или изменить его на:

location ^~ /Admin { ... } 

, который является местом префикса, который имеет приоритет над любой точкой регулярного выражения (в котором если его порядок в файле становится неактуальным).

Вторая проблема заключается в задаче allow 127.0.0.1. Ожидаете ли вы выполнить .php файлы с префиксом /Admin от клиента в 127.0.0.1?

Ваш блок местоположения администратора не содержит кода для выполнения .php файлов. Если намерение состоит в том, чтобы выполнить .php файлы с /Admin префиксом, вы можете попробовать:

location ~ \.php$ { 
    try_files $uri =404; 
    fastcgi_pass unix:/run/php/php-fpm.sock; 

    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PHP_VALUE "error_log=/var/www/home/php_errors.log"; 
} 

location ^~ /Admin { 
    allow 127.0.0.1; 
    deny all; 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_pass unix:/run/php/php-fpm.sock; 

     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 
} 

Вы можете использовать include директиву, чтобы переместить общие заявления в отдельный файл.

См. how nginx processes a request.

 Смежные вопросы

  • Нет связанных вопросов^_^