html5的tabindex标签 作者: zorth 时间: 2024-12-04 分类: 默认分类 评论 tabindex属性用于控制HTML元素的键盘导航(Tab键)顺序,这对网页的可访问性(accessibility)非常重要。让我详细解释: 1. tabindex的基本值: ```html 可聚焦元素 程序控制聚焦 ``` 2. 默认可聚焦的元素(不需要tabindex): ```html 链接 按钮 ``` 3. 常见使用场景: a) 自定义组件使其可聚焦: ```html 自定义按钮 ``` b) 创建模态框焦点陷阱: ```html 确认 取消 ``` c) 跳过导航: ```html 跳到主要内容 ... ... ``` 4. 最佳实践: ✅ 推荐做法: ```html 点击我 错误提示 首页 关于 ``` ❌ 避免的做法: ```html 第五个 第一个 普通文本不需要聚焦 ``` 5. 注意事项: 1) 可访问性考虑: - 确保键盘导航顺序合理 - 为可聚焦元素提供适当的视觉反馈 ```css [tabindex]:focus { outline: 2px solid blue; /* 确保有清晰的焦点样式 */ } ``` 2) 性能考虑: - 避免过多使用tabindex - 优先使用原生可聚焦元素 3) 用户体验: - 保持导航顺序符合用户预期 - 确保重要功能容易访问 6. 与ARIA结合使用: ```html × ``` 使用tabindex时的关键建议: 1. 尽量使用HTML原生的可聚焦元素 2. 只在必要时使用tabindex="0"或"-1" 3. 避免使用正整数值的tabindex 4. 确保键盘导航顺序符合逻辑 5. 测试网站的键盘可访问性
ID和Class属性的区别 作者: zorth 时间: 2024-12-04 分类: 默认分类 评论 ID和Class属性在HTML5中有以下主要区别: 1. 唯一性: - ID必须是唯一的,一个页面中不能有重复的ID值 - Class可以重复使用,多个元素可以使用相同的class值 ```html ``` 2. 使用场景: - ID通常用于: - 特定的唯一元素(如页面主容器、顶部导航等) - JavaScript获取特定元素 - 页面内部链接的锚点 ```html 跳转到内容 ``` - Class通常用于: - 样式复用 - 元素分组 - 多个样式组合 ```html 提交 取消 ``` 3. CSS选择器: - ID选择器使用#号 - Class选择器使用.号 ```css #header { /* ID选择器 */ background: black; } .button { /* Class选择器 */ padding: 10px; } ``` 4. 优先级: - ID选择器优先级高于Class选择器 ```css #submit-button { background: red; /* 这个会覆盖class的样式 */ } .button { background: blue; } ``` 5. JavaScript获取方式: ```javascript // 通过ID获取(返回单个元素) document.getElementById('header'); // 通过Class获取(返回元素集合) document.getElementsByClassName('button'); ``` 6. 命名规范: - ID通常用于描述"是什么"(what it is) ```html ``` - Class通常用于描述"什么样的"(what it's like)或可重用的样式 ```html ``` 最佳实践建议: 1. 尽量少用ID,除非确实需要唯一标识 2. 优先使用Class来定义样式 3. ID主要用于JavaScript操作和页面锚点 4. 使用有意义的命名,避免过于简单或难以理解的名称 5. 采用一致的命名规范(如kebab-case或camelCase)
spring boot中配置日志归档的模板 作者: zorth 时间: 2024-11-26 分类: 默认分类 评论 ![](https://zorth-1305096201.cos.ap-guangzhou.myqcloud.com/undefined20241126143027.png) SLF4J (Simple Logging Facade for Java) 实际上是一个日志门面框架,它本身并不提供日志实现,而是需要与具体的日志实现框架配合使用。Logback 就是 SLF4J 的一个原生实现。 1. **SLF4J + Logback 的关系**: - SLF4J 是接口(门面模式) - Logback 是实现 - Logback 的作者就是 SLF4J 的作者,所以它们是完全兼容的 1. **使用方式**: 需要添加以下依赖: ```xml org.slf4j slf4j-api 1.7.36 ch.qos.logback logback-classic 1.2.11 ``` 1. **代码中的使用**: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class YourClass { private static final Logger logger = LoggerFactory.getLogger(YourClass.class); public void someMethod() { logger.info("This is an info message"); logger.error("This is an error message"); } } ``` 1. **配置文件**: 完全可以使用之前提到的 logback.xml 配置文件来进行日志归档配置。实际上,使用 SLF4J + Logback 的组合时,Logback 会按以下顺序查找配置文件: 2. logback-test.xml 3. logback.xml 4. 如果都没找到,使用默认配置 ```xml %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${log.path}/app.log ${log.path}/app.%d{yyyy-MM-dd}.log 30 3GB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ``` 1. **注意事项**: - 确保没有引入其他日志实现框架的依赖,避免冲突 - 如果项目中有其他依赖间接引入了其他日志框架,需要排除它们: ```xml some.group some-artifact 1.0.0 commons-logging commons-logging ``` --- # 自用的`logback`的配置 1. 按天归档 2. 归档文件自动压缩为 .gz 格式 3. ERROR 级别日志单独存放 4. 普通日志和错误日志都按天归档并压缩 ```xml %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${log.path}/${app.name}.log ${log.path}/${app.name}.%d{yyyy-MM-dd}.log.gz 30 2GB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ERROR DENY ACCEPT ${log.path}/${app.name}-error.log ${log.path}/${app.name}-error.%d{yyyy-MM-dd}.log.gz 30 1GB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ERROR ACCEPT DENY 0 512 0 512 ```
兰空图床搭建 作者: zorth 时间: 2024-11-23 分类: 默认分类 评论 ![](https://zorth-1305096201.cos.ap-guangzhou.myqcloud.com/undefined20241123200945.png) 列出php的dnf源 [root@iZuf61llk9btoze85qtbmzZ ~]# dnf list php CentOS Stream 9 - BaseOS 34 MB/s | 8.3 MB 00:00 CentOS Stream 9 - AppStream 53 MB/s | 21 MB 00:00 CentOS Stream 9 - Extras packages 426 kB/s | 19 kB 00:00 Available Packages php.x86_64 8.0.30-1.el9 appstream [root@iZuf61llk9btoze85qtbmzZ ~]# 非常好,8.0.30,可以直接用了 [root@iZuf61llk9btoze85qtbmzZ ~]# dnf install php [root@iZuf61llk9btoze85qtbmzZ ~]# php -v PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies 下面开始安装nginx,安装好之后记得启动nginx [root@iZuf61llk9btoze85qtbmzZ ~]# dnf install nginx [root@iZuf61llk9btoze85qtbmzZ ~]# nginx -v nginx version: nginx/1.20.1 [root@iZuf61llk9btoze85qtbmzZ ~]# ps aux | grep nginx root 4721 0.0 0.1 6408 2304 pts/0 S+ 13:09 0:00 grep --color=auto nginx [root@iZuf61llk9btoze85qtbmzZ ~]# systemctl start nginx [root@iZuf61llk9btoze85qtbmzZ ~]# ps aux | grep nginx root 4728 0.0 0.0 11236 1632 ? Ss 13:09 0:00 nginx: master process /usr/sbin/nginx nginx 4729 0.0 0.2 15564 5216 ? S 13:09 0:00 nginx: worker process nginx 4730 0.0 0.3 15564 5344 ? S 13:09 0:00 nginx: worker process root 4737 0.0 0.1 6408 2304 pts/0 S+ 13:09 0:00 grep --color=auto nginx 启动nginx之后,可以直接访问网站了: ![image.png](https://note.youdao.com/yws/res/1/WEBRESOURCE6d4677ad43d90956d1293cd90c31c061) 进入nginx路径,开始配置https,操作配置文件之前记得备份 [root@iZuf61llk9btoze85qtbmzZ nginx]# cd /etc/nginx/ [root@iZuf61llk9btoze85qtbmzZ nginx]# cp nginx.conf nginx.conf.bak [root@iZuf61llk9btoze85qtbmzZ nginx]# 在此之前先去配置一下域名的dns,把我的域名和ip绑定好。 ![image.png](https://note.youdao.com/yws/res/0/WEBRESOURCE5587d5d43464a152cc7062301d19a350) 这里有一个很关键的地方,使用cf作为dns服务器的时候,还需要设置一下SSL的强制HTTPS ![image.png](https://note.youdao.com/yws/res/4/WEBRESOURCE38317958c014c0328d0b7cf55d256514) 现在开始配置nginx的配置文件: # HTTP服务器(重定向到HTTPS) server { listen 80; listen [::]:80; server_name zorth.top; # 替换为你的域名 # 将所有HTTP请求重定向到HTTPS return 301 https://$server_name$request_uri; } # HTTPS服务器 server { listen 443 ssl; listen [::]:443 ssl; server_name zorth.top; # 替换为你的域名 # SSL配置 ssl_certificate /path/to/your/certificate.crt; # 替换为你的证书路径 ssl_certificate_key /path/to/your/private.key; # 替换为你的私钥路径 # SSL安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # 网站根目录 root /usr/share/nginx/html; # 替换为你的网站目录 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } # PHP配置 location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # 如果使用TCP,改为 127.0.0.1:9000 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 禁止访问 .htaccess 文件 location ~ /\.ht { deny all; } } 修改完配置之后,记得验证一下配置: [root@iZuf61llk9btoze85qtbmzZ nginx]# nginx -t nginx: [emerg] cannot load certificate "/path/to/your/certificate.crt": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/path/to/your/certificate.crt, r) error:10000080:BIO routines::no such file) nginx: configuration file /etc/nginx/nginx.conf test failed [root@iZuf61llk9btoze85qtbmzZ nginx]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@iZuf61llk9btoze85qtbmzZ nginx]# systemctl restart nginx 再次访问刚才的域名时,会直接重定向到https了 ![image.png](https://note.youdao.com/yws/res/3/WEBRESOURCEfff93410ce04d94d96b5b1d1d3a0a4c3) ![image.png](https://note.youdao.com/yws/res/f/WEBRESOURCE1903c4a491d17ffe03b11bad66289b4f) nginx配置完毕了,开始安装图床 [root@iZuf61llk9btoze85qtbmzZ nginx]# cd /usr/share/nginx/html/ [root@iZuf61llk9btoze85qtbmzZ html]# ll total 22356 -rw-r--r-- 1 root root 3971 Jul 16 07:21 404.html -rw-r--r-- 1 root root 4020 Jul 16 07:21 50x.html drwxr-xr-x 2 root root 27 Nov 23 13:08 icons lrwxrwxrwx 1 root root 25 Jul 16 07:22 index.html -> ../../testpage/index.html -rw-r--r-- 1 root root 22876343 Nov 23 13:32 lsky-pro-2.1.zip -rw-r--r-- 1 root root 368 Jul 16 07:21 nginx-logo.png lrwxrwxrwx 1 root root 14 Jul 16 07:22 poweredby.png -> nginx-logo.png lrwxrwxrwx 1 root root 37 Jul 16 07:22 system_noindex_logo.png -> ../../pixmaps/system-noindex-logo.png [root@iZuf61llk9btoze85qtbmzZ html]# 上传安装包之后,解压安装包。![image.png](https://note.youdao.com/yws/res/6/WEBRESOURCEf98d22b0e002a18e1c58de03ef076436) 我这里在root路径下解压了,然后将配置指向了public路径。
HTTP到HTTPS 作者: zorth 时间: 2024-11-20 分类: 默认分类 评论 # HTTP 与 HTTPS:有什么区别 HTTPS 是支持加密和验证的 HTTP。两种协议的唯一区别是HTTPS 使用 TLS (SSL) 来加密普通的 HTTP 请求和响应,并对这些请求和响应进行数字签名。因此,HTTPS 比 HTTP 安全得多。使用 HTTP 的网站的 URL 中带有 `http://`,而使用 HTTPS 的网站则带有 `https://`。 ![1732255490180.png](https://47.116.196.61/i/2024/11/22/67401f0495d7b.png) # 什么是 HTTP HTTP 代表超文本传输协议,它是一种用于通过网络传输数据的协议,或是一种表示信息的规范顺序和语法。通过互联网发送的大多数信息(包括网站内容和 API 调用)都使用 HTTP 协议。HTTP 消息主要有两种:请求和响应。 简单来说,HTTP 请求是遵循 HTTP 协议的一系列文本行。GET 请求可能如下所示: ```json GET /hello.txt HTTP/1.1 User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11 Host: www.example.com Accept-Language: en ``` 用户浏览器生成的这部分文本将通过 Internet 发送。而问题在于,它是明文形式发送的,监视连接的任何人都能读取它。(不熟悉 HTTP 协议的人可能觉得此文本难以理解,但任何对协议的命令和语法有基本了解的人都能轻松读懂。) 当用户通过网站或 Web 应用程序提交敏感数据时,这尤其是一个问题。敏感数据可能是密码、信用卡号,或在表单中输入的任何其他数据。而且在 HTTP 中,所有这些数据都以明文形式发送,任何人都能读取。(当用户提交表单时,浏览器会将其转换为 HTTP POST 请求,而不是 HTTP GET请求。) 源站服务器收到 HTTP 请求时,将发送 HTTP 响应,其类似于: ```json HTTP/1.1 200 OK Date: Wed, 30 Jan 2019 12:14:39 GMT Server: Apache Last-Modified: Mon, 28 Jan 2019 11:17:01 GMT Accept-Ranges: bytes Content-Length: 12 Vary: Accept-Encoding Content-Type: text/plain Hello World! ``` 如果网站使用 HTTP 而非 HTTPS,则监视会话的任何人都可以读取所有请求和响应。本质上,恶意行为者可以只读取请求或响应中的文本,就能知道某人正在索取、发送或接收的确切信息。 # 什么是 HTTPS HTTPS 中的 S 代表“安全”。HTTPS 使用 TLS(或 SSL)来加密HTTP 请求和响应,因此在上例中,攻击者看到的不是其文本,而是一堆看似随机的字符。 攻击者不会看到: ```json GET /hello.txt HTTP/1.1 User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11 Host: www.example.com Accept-Language: en ``` 而会看到类似如下: ```json t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1H5miNieJeJ/FNUjgH0BmVRWII6+T4MnDwmCMZUI/orxP3HGwYCSIvyzS3MpmmSe4iaWKCOHQ== ``` # 在 HTTPS 中,TLS/SSL 如何加密 HTTP 请求和响应 TLS 使用一种称为公钥加密的技术:密钥有两个,即公钥和私钥,其中公钥通过服务器的 SSL 证书与客户端设备共享。当客户端打开与服务器的连接时,这两个设备使用公钥和私钥商定新的密钥(称为会话密钥),以加密它们之间的后续通信。 然后,所有 HTTP 请求和响应都使用这些会话密钥进行加密),使任何截获通信的人都只能看到随机字符串,而不是明文。 有关加密和密钥的工作原理的更多信息,请参阅什么是加密? # HTTPS 如何帮助验证 Web 服务器身份 身份验证是指核实一个人或一台计算机是否是声称的身份。HTTP 中没有身份验证,它基于信任原则。HTTP 的架构师不一定是做出了隐式信任所有 Web 服务器的决定;他们当时除了安全以外还有其他优先事务。但在现代 Internet 上,身份验证是不可或缺的。 就像身份证件能确认一个人的身份一样,私钥可以确认服务器的身份。当客户端打开与源站服务器的连接通道时(例如,当用户导航到网站时),拥有与网站 SSL 证书中公钥匹配的私钥可证明此服务器确实是该网站的合法主机。这可以防止或帮助阻止在没有身份验证时可能发生的多种攻击. 此外,SSL 证书由签发它的证书颁发机构进行数字签名。这可以确认服务器就是它声称的身份。 # 举例 为了更鲜明得展示两者的区别,我们使用抓包工具Wireshark,分别抓取http请求和https请求。 ![http请求.png](https://47.116.196.61/i/2024/11/22/67401e4446047.png) ![https请求.png](https://47.116.196.61/i/2024/11/22/67401e84dd082.png) 我们可以看到,当使用http请求时,我们可以在Wireshark面板看到请求体中的明文信息,当我们使用https请求时,所有的请求体都是加密的。 ![微信图片_20240421104020.jpg](https://47.116.196.61/i/2024/11/20/673d66e182758.jpg) 这两天折腾了图床、博客还有学了会日语。我觉得这种状态挺好的,折腾图床的过程中学习了使用https提供加密的服务,原来可以通过修改nginx的配置来重定向http请求到https。 ```json # HTTP服务器配置(重定向到HTTPS) server { listen 80; server_name your_domain.com; # 替换成你的域名 # 将所有HTTP请求重定向到HTTPS return 301 https://$server_name$request_uri; } # HTTPS服务器配置 server { listen 443 ssl; server_name your_domain.com; # 替换成你的域名 # SSL证书配置 ssl_certificate /path/to/your/certificate.crt; # 替换成你的证书路径 ssl_certificate_key /path/to/your/private.key; # 替换成你的私钥路径 # SSL配置优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # SSL会话缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS配置(可选) add_header Strict-Transport-Security "max-age=31536000" always; # 网站根目录配置 root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } } ``` 这个是基础的使用示例,其实部署别人的服务的话,以php为例,还需要做一些处理,对于PHP服务,我们需要在Nginx配置中添加PHP-FPM的相关配置。以下是一个完整的包含PHP支持的HTTPS配置: ```json # HTTP服务器配置(重定向到HTTPS) server { listen 80; server_name your_domain.com; return 301 https://$server_name$request_uri; } # HTTPS服务器配置 server { listen 443 ssl; server_name your_domain.com; # SSL证书配置 ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; # SSL配置优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS配置(可选) add_header Strict-Transport-Security "max-age=31536000" always; # 网站根目录 root /var/www/html; # 修改为你的网站目录 index index.php index.html index.htm; # PHP文件处理 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # PHP-FPM socket路径 # 或者使用TCP方式: # fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 安全相关头部 fastcgi_param HTTPS on; } # 隐藏文件访问限制 location ~ /\. { deny all; } # 静态文件缓存设置 location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; add_header Cache-Control "public, no-transform"; } # 主目录配置 location / { try_files $uri $uri/ /index.php?$query_string; # 支持PHP框架的URL重写 } } ``` 这里还需要确保php-fpm正在运行 ```json # 安装PHP-FPM(以Ubuntu为例) apt-get install php-fpm # CentOS/RHEL系统: yum install php-fpm # 启动PHP-FPM服务 systemctl start php-fpm systemctl enable php-fpm ``` 检查PHP-FPM配置文件(通常在 /etc/php-fpm.d/www.conf 或 /etc/php/7.x/fpm/pool.d/www.conf): ```json ; 确保用户和组设置正确 user = nginx group = nginx ; 如果使用Unix socket listen = /var/run/php-fpm/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 0660 ; 如果使用TCP ; listen = 127.0.0.1:9000 ``` 设置正确的文件权限: ```json # 设置网站目录权限 chown -R nginx:nginx /var/www/html chmod -R 755 /var/www/html ``` 注意:PHP-FPM错误日志(通常在 /var/log/php-fpm/error.log) --- ```json location ~ \.php$ { # ~ \.php$ 是一个正则表达式,匹配所有以.php结尾的文件 # location 块定义了对PHP文件的处理规则 try_files $uri =404; # 检查PHP文件是否存在,如果不存在则返回404错误 # 这是一个安全措施,防止执行不存在的PHP文件 fastcgi_split_path_info ^(.+\.php)(/.+)$; # 分割URL中的路径信息 # 例如:/script.php/extra/info 会被分割成: # $fastcgi_script_name: /script.php # $fastcgi_path_info: /extra/info fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # 指定如何连接到PHP-FPM处理程序 # 这里使用Unix socket方式(更快,推荐在同一服务器上使用) # fastcgi_pass 127.0.0.1:9000; # 另一种连接方式是TCP(如果PHP-FPM在不同服务器上,就用这个) fastcgi_index index.php; # 设置默认的PHP文件名 # 当访问目录时,默认寻找index.php fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 设置PHP脚本的实际文件路径 # $document_root 是网站根目录 # $fastcgi_script_name 是PHP文件名 # 例如:/var/www/html/index.php include fastcgi_params; # 包含Nginx预定义的FastCGI参数 # 这个文件通常在 /etc/nginx/fastcgi_params # 包含了许多必要的环境变量 fastcgi_param HTTPS on; # 告诉PHP脚本当前是HTTPS连接 # 这样PHP可以正确识别安全连接 } ``` 这里有一些实际的例子: 当访问 https://your-site.com/index.php 时: - Nginx 匹配到这是一个 .php 文件 - 检查文件是否存在(try_files) - 如果存在,通过 socket 或 TCP 传递给 PHP-FPM 处理 - PHP-FPM 执行这个文件并返回结果给 Nginx - Nginx 再将结果发送给用户 部署时的问题排查: ```json # 1. 检查PHP-FPM是否运行 systemctl status php-fpm # 2. 检查socket文件是否存在 ls -l /var/run/php-fpm/php-fpm.sock # 3. 检查日志文件权限 ls -l /var/log/php-fpm/error.log # 4. 测试PHP文件权限 ls -l /var/www/html/index.php ```