# 苏州科普站 Nginx 草稿:默认站点 + 上传目录禁止解析 PHP # 仅供运维对照落地,不要直接覆盖线上未确认的路径/证书/php-fpm 套接字。 # 占位请替换: # ROOT 本站 public 目录,例如 /var/www/szkp-map-service/public # FPM_SOCK 本站独立 php-fpm,例如 unix:/run/php/php8.1-fpm-szkp.sock # SERVER_NAME 本站域名(可多个) # 不要改应用 URL:图片仍走 /storage/uploads/... # --------------------------------------------------------------------------- # 一、默认站点:扫 IP、未知 Host 不要落到本站 # 必须出现在本站 server 之前,或明确 listen ... default_server # --------------------------------------------------------------------------- server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 444:直接断开,不回你站的页面/框架/路径 return 444; } # Nginx >= 1.19.4 推荐:HTTPS 扫 IP 时拒绝握手,不必准备假证书 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_reject_handshake on; } # 若当前 Nginx 不支持 ssl_reject_handshake,改用下面这段(二选一,不要两段都开) # server { # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # server_name _; # ssl_certificate /path/to/any.crt; # ssl_certificate_key /path/to/any.key; # return 444; # } # --------------------------------------------------------------------------- # 二、本站(科普)正式站点 # 确认本站 listen 行上没有 default_server # --------------------------------------------------------------------------- server { listen 80; listen [::]:80; server_name YOUR_SZKP_DOMAIN.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name YOUR_SZKP_DOMAIN.example.com; root /var/www/szkp-map-service/public; index index.php; charset utf-8; ssl_certificate /path/to/szkp.fullchain.pem; ssl_certificate_key /path/to/szkp.privkey.pem; add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options SAMEORIGIN always; # 上传目录:只当静态文件,绝不进 PHP # ^~ 优先于正则,避免 *.php 落到下面的 location ~ \.php$ location ^~ /storage/uploads { alias /var/www/szkp-map-service/storage/app/public/uploads; # 若已做 public/storage 软链,可改成不写 alias,仅靠 root + try_files: # try_files $uri =404; add_header X-Content-Type-Options nosniff always; types { } default_type application/octet-stream; location ~* \.(php|phtml|phar|php[0-9]|pht|phps|shtml)$ { deny all; return 404; } try_files $uri =404; } location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php/php8.1-fpm-szkp.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; fastcgi_hide_header X-Powered-By; } location ~ /\.(?!well-known).* { deny all; } } # --------------------------------------------------------------------------- # 三、同机其他站点(如 www.szyljt.com) # 若该站也能访问到同一份 storage,必须同样禁止解析,否则扫那个域名仍能打到上传文件。 # 把下面 location 原样放进那个站点的 server {},路径改成实际 uploads 目录。 # --------------------------------------------------------------------------- # location ^~ /storage/uploads { # alias /var/www/szkp-map-service/storage/app/public/uploads; # add_header X-Content-Type-Options nosniff always; # location ~* \.(php|phtml|phar|php[0-9]|pht|phps|shtml)$ { # deny all; # return 404; # } # try_files $uri =404; # } # --------------------------------------------------------------------------- # 落地检查(运维执行,不必改代码) # 1. nginx -t && 重载 # 2. 浏览器或 curl 访问 http://服务器IP/ 应无本站页面(连接被关或非 200 业务页) # 3. 用本站域名访问一张已有 jpg,地址仍是 /storage/uploads/xxx.jpg,能正常显示 # 4. 访问 /storage/uploads 下任何 .php 应为 404,且不应再被 PHP 执行 # 5. 本站与同机其他站使用不同 Linux 用户、不同 php-fpm 池,并限制 open_basedir # ---------------------------------------------------------------------------