Nginx通过location配置实现虚拟目录,优先用alias映射子路径,root用于根拼接;框架需rewrite隐藏入口文件,匹配优先级决定规则生效顺序,正则应克制使用并禁用敏感目录直访。

PHP 本身不创建虚拟目录,所谓“虚拟目录”是 Web 服务器(如 Nginx)对请求路径的映射处理。在 Nginx 中实现类似 Apache 的 或 PHP 的“伪虚拟目录”效果,核心靠 location 配置 + 路径重写(rewrite)或别名(alias),而非 PHP 自身行为。
location 实现路径映射:alias vs root
当希望把 /admin/ 这样的 URL 映射到物理路径 /var/www/app/backend/ 时,不能用 root 简单拼接(它会追加完整 URI),而应优先用 alias:
-
alias是“路径替换”:匹配部分被完全替换,适合子路径映射
location /admin/ { alias /var/www/app/backend/; }
访问/admin/index.php→ 实际读取/var/www/app/backend/index.php(注意alias值末尾必须带/) -
root是“根目录拼接”:URI 全部追加到指定路径后
location /static/ { root /data/assets; }
访问/static/css/app.css→ 实际读取/data/assets/static/css/app.css
隐藏入口文件:ThinkPHP/Laravel 等框架必需的 rewrite 规则
主流 PHP 框架依赖 PATH_INFO 或 QUERY_STRING(如 /index.php?s=/user/list)解析路由。Nginx 默认不传递 PATH_INFO,需显式重写:
- 在
server块中、location ~ \.php$之前 插入: - location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
} -
关键点:
last触发重写后重新匹配 location,确保请求进入 PHP 处理块;if虽非官方推荐,但在宝塔+TP6/Laravel 场景下兼容性最稳;!-e $request_filename只重写真实不存在的文件/目录,静态资源直出不干扰
匹配优先级决定规则是否生效
Nginx 不按配置顺序执行,而是严格按优先级选唯一匹配项。常见误区是把正则规则写在前面却无效——因为更高级别的前缀匹配已截断:
- 优先级从高到低:
=(精确)→^~(最长前缀,终止搜索)→~/~*(正则,按配置顺序取首个命中)→/(通用前缀) - 例:
location ^~ /api/和location ~ \.php$同时存在,/api/v1/user.php会进^~块(前缀匹配优先),不会触发 PHP 正则块 - 调试建议:用
nginx -t检查语法,再用curl -I http://your.site/test配合error_log查看实际匹配的 location 名称
性能与安全提醒
正则匹配消耗 CPU,生产环境应克制使用:
- 避免
location ~ .*\.php$这类贪婪匹配,改用location ~ \.php$(结尾锚定) - 静态资源优先用
^~前缀匹配(比正则快 20%+),如:location ^~ /static/ { expires 1y; } - 敏感目录禁止直接暴露(如
/runtime/、/vendor/),用location ~ ^/(runtime|vendor)/ { return 403; }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











