LEMP本地开发服务器:NGINX多站点无需手动配置location的正则方案咨询
使用Nginx正则实现LEMP多站点自动匹配
当然可以用正则表达式搞定这个需求,不用再手动给每个站点写重复的location块!下面直接给你可行的配置方案和关键细节说明:
核心配置思路
通过命名捕获正则提取URL中的站点名称(比如site1、site2),然后复用这个变量来统一处理所有站点的请求路由和PHP解析。
完整Nginx配置示例
server { listen 80; server_name localserver; # 这里填写所有站点的父目录,比如site1、site2都放在这个目录下 root /var/www/local-sites; # 匹配所有以 /[站点名] 开头的请求,捕获站点名称到$site变量 location ~^/(?<site>[a-z0-9_-]+) { # 先尝试访问站点目录下的静态文件/目录,找不到就转发到对应站点的index.php try_files $uri $uri/ /$site/index.php?$args; # 嵌套处理PHP请求,确保每个站点的PHP文件能正确解析 location ~ \.php$ { # 根据你的PHP-FPM版本调整socket路径,也可以用127.0.0.1:9000 fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_index index.php; # 这里的$document_root就是上面定义的父目录,拼接后就是站点的PHP文件路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } # 可选:根路径默认跳转(比如跳转到第一个站点) location / { return 302 /site1/; } }
关键细节解释
- 正则捕获组:
(?<site>[a-z0-9_-]+)会把URL中/后面的第一个分段(比如site1)捕获到$site变量里。如果你的站点名称包含大写字母,把正则改成[A-Za-z0-9_-]+即可。 - root目录设置:必须指向所有站点的父目录,比如
site1的完整路径是/var/www/local-sites/site1,那root就填/var/www/local-sites,这样$document_root/$site就是对应站点的根目录。 - PHP解析逻辑:嵌套的
location ~ \.php$会处理所有站点下的PHP请求,通过$document_root$fastcgi_script_name确保FastCGI能找到正确的PHP文件。
测试与验证
- 把配置放到Nginx的sites-available目录(或者直接修改nginx.conf)
- 用
nginx -t检查配置语法是否正确 - 重启Nginx:
systemctl restart nginx(根据你的系统调整命令) - 访问
http://localserver/site1/或者http://localserver/site2/就能自动对应到各自的站点目录了
内容的提问来源于stack exchange,提问作者Freddie
相关产品推荐
相关产品推荐

