我的虚拟主机有这个配置:
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;
}
}
当我尝试访问页面时,管理员nginx返回404代码,其中包含由php生成的成功html内容。当删除/ Admin的位置时,一切顺利。
如何获得附加位置的问题?
答案 0 :(得分:1)
您应该阅读this document以了解各种位置块的优先顺序。
因此,您可以将正则表达式位置放在location ~ \.php$
块上方以使其优先,或将其更改为:
location ^~ /Admin { ... }
这是一个优先于任何正则表达式位置的前缀位置(在这种情况下,它在文件中的顺序变得无关紧要)。
第二个问题是allow 127.0.0.1
声明的目的。您是否希望从127.0.0.1的客户端执行带有.php
前缀的/Admin
文件?
您的管理位置块不包含执行.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
指令将公共语句移动到单独的文件中。