好大一个坑:在Nginx上将PHP网页放在二级目录

news/2025/2/22 16:22:43/

1、原由

只有一个域名,以前用php编写的网页又不能放弃,考虑将其移至二级目录下,例如:

https://abc.com/html

2、运行环境

Linux服务器上,用docker容器。Nginx和php-fpm各自运行在不同的容器中,Nginx在前端负责接收http请求,将其分发到后面不同的服务容器中。收到PHP网页请求就交给php-fpm解析,php-fpm的端口是9000。

3、Nginx配置

3.1 如果使用根目录

如果php网页在根目录下就比较简单,用下面配置即可:

server {listen  80;server_name abc.com;root   /usr/share/nginx/html;index index.html index.htm index.php;location / {try_files $uri $uri/ /index.php?$query_string;location ~ \.php(.*)$ {root   /var/www/html/phpmy;fastcgi_pass 172.17.0.1:9000;   #php容器的IP地址fastcgi_index index.php;fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;include  fastcgi_params;}}
}

3.2 将php网页放在二级目录

将3.1的方法直接移植过来是行不通的,先放结果,正确的配置文件如下:

    location /html {alias  /var/www/html/; #PHP文件在php-fpm容器中的目录index index.php index.htm index.html;try_files $uri $uri/ /html/index.php?$query_string;if (!-e $request_filename) {rewrite ^/html/(.*)$ /html/index.php?$1 last;break;}location ~ \.php(.*)$ {fastcgi_pass 172.17.0.1:9000;   # PHP容器的IP地址fastcgi_index index.php;fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;fastcgi_param SCRIPT_FILENAME $request_filename;include  fastcgi_params;        }location ~* \.(htm|html|jpg|jpeg|png|gif|ico|js|css|map)$ {root  /usr/share/nginx/;   # 静态文件目录比真实目录少一级,访问时会自动加上url的子目录}    }

与在根目录下的情况不同,传给 location /html的目录是PHP文件在php-fpm容器中的目录。php-fpm接收的SCRIPT_FILENAME是 $request_filename

  • 下面一段是解决页面跳转后不能正确定位问题:
        if (!-e $request_filename) {rewrite ^/html/(.*)$ /html/index.php?$1 last;break;}
  • 这个location是解决非php文件不能访问的问题:
location ~* \.(htm|html|jpg|jpeg|png|gif|ico|js|css|map)$ {root  /usr/share/nginx/;   # 静态文件目录比真实目录少一级,访问时会自动加上url的子目录}    

目前这个配置文件还是有一些问题,比如直接访问目录时不能直接跳到index.php文件,访问时必须这样:

https://abc.com/html/index.php

http://www.ppmy.cn/news/987701.html

相关文章

Numpy-聚合函数

NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等。 函数名说明np.sum()求和np.prod()所有元素相乘np.mean()平均值np.std()标准差np.var()方差np.median()中位数np.power()幂运算np.sqrt()开方np.min()最小…

MySQL中锁的简介——表级锁-元数据锁、意向锁

1.元数据锁 查看元数据锁 select object_type,object_scheme,object_name,lock_type,lock_duration from perfomance_scheme.metadata_locks;2.意向锁 线程A开启事务后在执行update更新语句时候,会给数据加上行锁,加上行锁以后,会对整张表加…

Redis实战(3)——缓存模型与缓存更新策略

1 什么是缓存? 缓存就是数据交换的缓冲区, 是存贮数据的临时区,一般读写性能较高 \textcolor{red}{是存贮数据的临时区,一般读写性能较高} 是存贮数据的临时区,一般读写性能较高。缓存可在多个场景下使用 以一次 w e b 请求为例…

flink源码分析-获取JVM最大堆内存

flink版本: flink-1.11.2 代码位置: org.apache.flink.runtime.util.EnvironmentInformation#getMaxJvmHeapMemory 如果设置了-Xmx参数,就返回这个参数,如果没设置就返回机器物理内存的1/4. 这里主要看各个机器内存的获取方法。 /*** The maximum JVM…

SQL基础使用

SQL的概述 SQL全称: Structured Query Language,结构化查询语言,用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。 经过多年发…

问题解决——datagrid远程连接虚拟机中ubuntu的mysql失败

问题解决——datagrid远程连接虚拟机中ubuntu的mysql失败 情况:datagrid远程win11系统下虚拟机里的ubuntu20.04的mysql,连接失败。 1 如果是防火墙没开放3306端口,则需要开放:linux 3306端口无法连接 无法通过防火墙的解决办法 …

ICML 2023 | 拓展机器学习的边界

编者按:如今,机器学习已成为人类未来发展的焦点领域,如何进一步拓展机器学习技术和理论的边界,是一个极富挑战性的重要话题。7月23日至29日,第四十届国际机器学习大会 ICML 2023 在美国夏威夷举行。该大会是由国际机器…

app上有个播放视频的功能,客户反馈某个时间段会卡顿,初步分析是用户多,让测试一下性能

当应用上有播放视频的功能,而用户反馈在某个时间段会出现卡顿问题时,你可以通过进行性能测试来分析这个问题。性能测试是一种评估应用在不同条件下行为的测试方法,以确保它满足所需的性能标准。以下是一些步骤: 设置测试环境&…