文章目录[隐藏]
需求
已有一个域名:test.demo.com,对应网站A,代码路径:/var/docker/site/a;另外还有一个网站B,代码路径:/var/docker/site/b,当访问test.demo.com/b显示网站B。
nginx配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
server { listen 80; listen [::]:80; server_name test.demo.com; # 同域名 root /var/docker/site/a; # 网站A代码路径 index index.php index.html index.htm; # 当访问 test.demo.com/b,显示网站B location /b { alias /var/docker/site/b; # 更改为网站B的代码路径 index index.php index.html; # 网站B 资源处理(如图片/css/js等) ## location ~ /b {} 只能匹配 ip/b ; location ~ /b/(.*)$ {} 则可以匹配 ip/b/xxx/xxx/xx.js location ~ /b/(.*)$ { alias /var/docker/site/b/resource/; # 更改资源路径 # 依照顺序尝试访问文件,至少需要两个值 # 假如访问:test.demo.com/b/main.js # $1 是“/b/(.*)$”正则匹配捕获的值,得到的值是:main.js # $uri 是nginx自带的变量,它的值是:b/main.js # try_files 使用定义的路径作为前缀。下面相当于依次访问: # ($1)/var/docker/site/b/resource/main.js、($uri)/var/docker/site/b/resource/b/main.js ### # 这里只有“$1”的路径是正确的,nginx默认是取域名后的路径拼接root获得文件的路径,例如:$uri,路径多了个“/b”, # 所以,需要使用正则,把“/b”去掉,拼接后的地址才会正确,例如:$1 ### try_files $1 $uri; #return 200 "参数:$1"; # 可以打印nginx的参数 } # 网站B php处理 location ~ \.php$ { root /var/docker/site/b; # 告诉php,到这个路径找代码 # 正则表达式应该有两个捕获:第一个为 $fastcgi_script_name 变量的值,第二个为 $fastcgi_path_info 变量的值。 # 以这条为例,当访问 test.demo.com/b/xxx.php?act=index, # $fastcgi_script_name的值为: /xxx.php, # $fastcgi_path_info的值为: act=index ### # 这里这么做是因为nginx默认是取域名后的地址拼接root的。如:test.demo.com/b/xxx.php,默认取到的值是:/b/xxx.php, # 拼接root后,访问路径是:/var/docker/site/b/b/xxx.php,这个路径是错的。 # 所以,需要手动的把“/b”去掉,手动拼接正确的路径。使用正则“^/b(.+\.php)(.*)$”,那么$fastcgi_script_name的值就是“/xxx.php” # 再手动设置fastcgi参数“SCRIPT_FILENAME”告诉php正确的文件路径, # “$document_root$fastcgi_script_name”相当于:/var/docker/site/b/xxx.php,php就能正确的访问路径了。 ### fastcgi_split_path_info ^/b(.+\.php)(.*)$; fastcgi_pass unix:/sock/php74-fpm.sock; # php服务地址,php文件转发给php处理 fastcgi_index index.php; include fastcgi_params; # 引入默认的php服务端参数,这些参数都可以在php的超全局变量$_SERVER看到。 # 修改php服务端参数。要先include fastcgi_params;再改,反过来的话修改的值会被fastcgi_params覆盖掉。 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $fastcgi_script_name; fastcgi_param DOCUMENT_URI $fastcgi_script_name; } } location / { } # 网站A php处理 location ~ \.php$ { root /var/docker/site/a; fastcgi_pass unix:/sock/php74-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
参考
关于fastcgi_split_path_info
语法:fastcgi_split_path_info regex
;
上下文:location
定义一个捕获 $fastcgi_path_info 变量值的正则表达式。正则表达式应该有两个捕获:第一个为 $fastcgi_script_name 变量的值,第二个为 $fastcgi_path_info 变量的值。
具体可以参考官方文档:ngx_http_fastcgi_module 找到 fastcgi_split_path_info。
中文可以看这里:nginx fastcgi模块ngx_http_fastcgi_module详细解析、使用手册、完整翻译
关于fastcgi_param
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123 fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST) fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段 fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。 fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称 fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数 fastcgi_param DOCUMENT_URI $document_uri; #与$uri相同。 fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值 fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 fastcgi_param GATEWAY_INTERFACE CGI/1.1;#cgi 版本 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;#nginx 版本号,可修改、隐藏 fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP fastcgi_param REMOTE_PORT $remote_port; #客户端端口 fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址 fastcgi_param SERVER_PORT $server_port; #服务器端口 fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name #fastcgi_param PATH_INFO $path_info;#可自定义变量 # PHP only, required if PHP was built with --enable-force-cgi-redirect #fastcgi_param REDIRECT_STATUS 200; 在php可打印出上面的服务环境变量 如:echo $_SERVER['REMOTE_ADDR'] |
关于如何打印nginx变量
1 |
return 200 "变量" |