在Nginx中,location
指令用于匹配请求URI并定义如何处理这些请求。配置多个location块是Nginx中常见的做法,下面我将详细介绍如何正确配置多个location。
location [修饰符] 匹配模式 {
# 配置指令
}
精确匹配:使用=
修饰符
location = /exact/path {
# 只匹配/exact/path
}
前缀匹配:无修饰符
location /prefix {
# 匹配以/prefix开头的URI
}
正则表达式匹配:使用~
(区分大小写)或~*
(不区分大小写)
location ~ \.php$ {
# 匹配以.php结尾的URI,区分大小写
}
最长前缀匹配:使用^~
修饰符
location ^~ /images {
# 匹配以/images开头的最长URI,不检查正则表达式
}
server {
listen 80;
server_name example.com;
# 1. 精确匹配 - 最高优先级
location = / {
root /var/www/html;
index index.html;
}
# 2. 静态文件处理
location ^~ /static/ {
root /var/www;
expires 30d;
}
# 3. PHP处理
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 4. 图片处理
location ~* \.(jpg|jpeg|png|gif|ico)$ {
root /var/www/images;
expires max;
}
# 5. 通用匹配 - 最低优先级
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
Nginx按照以下顺序评估location匹配:
=
精确匹配^~
最长前缀匹配(不检查正则)~
或 ~*
正则表达式匹配(按配置文件中的顺序)^~
避免正则匹配开销server {
# ...其他配置...
# API路由
location /api/v1/ {
proxy_pass http://api_backend;
proxy_set_header Host $host;
}
# 管理后台
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
try_files $uri /admin/index.html;
}
# WebSocket支持
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 禁止访问某些文件
location ~ /\.(ht|git) {
deny all;
return 404;
}
}
通过合理配置多个location块,可以构建灵活、高效的Nginx服务器配置,满足各种复杂的请求处理需求。