You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx服务器仅部分目录支持PHP及HTML嵌入PHP的问题求助

问题描述

我通过Docker容器部署了Nginx、PHP和MariaDB,站点目录结构如下:

htdocs
|--Common     (存放CSS、JS等文件)
|--Resources  (存放图片、视频资源)
|--labs       (实验目录)
|  |--ExperimentSite
|--blog       (博客目录)
|--forum      (论坛目录)
|--family

根目录、WordPress及Vanilla中的.php文件可正常运行,但/labs/ExperimentSite下的.php文件会被下载而非执行,同时无法运行HTML中嵌入的PHP代码。我认为问题出在Nginx站点配置文件中,以下是我的配置:

server {
        listen 0.0.0.0:8080;
        server_name  mywebsitename_placeholder.com www.mywebsitename_placeholder.com;
        return 301 https://$server_name$request_uri;
}

server {
        listen 0.0.0.0:8443;
        server_name  mywebsitename_placeholder.com www.mywebsitename_placeholder.com;
        ssl_certificate     bitnami/certs/www.mywebsitename_placeholder.com.crt;
        ssl_certificate_key bitnami/certs/www.mywebsitename_placeholder.com.key;
        server_tokens off;
        
        error_log "/opt/bitnami/nginx/logs/mywebsitename_placeholder-error.log";
        access_log  "/opt/bitnami/nginx/logs/mywebsitename_placeholder-access.log";

        error_page 403 /forbidden.html;
        error_page 404 /lost.html;

        location / {
                try_files $uri $uri/main.html;
        }

        location ~ \.php$ {
        # fastcgi_pass [PHP_FPM_LINK_NAME]:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass phpfpm-mywebsitename:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
                root /app;
                error_page 401 /badpassword.php;
                error_page 403 /forbidden.html;
                error_page 404 /lost.html;
                fastcgi_intercept_errors on;
        }

        location ~ \.html$ {
                root   /app/mywebsitename/htdocs;
        }
 
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|dmg|zip|svg|xml)$ {
                expires max;
                log_not_found off;
                root   /app/mywebsitename/htdocs;
        }
        
        location /blog {
                try_files $uri $uri/ /blog/index.php?$args;
        }

        location /forum {
                try_files $uri @vanilla;
        }

        location @vanilla {
                rewrite ^/forum(/.*) /forum/index.php?p=$1&$args last;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(/)(/.*)$;
        }

        location ^~ /family {
                root   /app/mywebsitename/htdocs;
                index  index.html;
                auth_basic "Restricted Content";
                auth_basic_user_file /app/.htpasswd;
        }

        location ^~ /labs/ExperimentSite {
                root   /app/mywebsitename/htdocs;
                index  index.html;
                auth_basic "Restricted Content";
                auth_basic_user_file /app/.htpasswd;
                
                try_files $uri $uri/ /labs/ExperimentSite/index.html?$args;
        }

}

请问我遗漏了什么配置才能让/labs/ExperimentSite正常运行?如何实现HTML中嵌入PHP代码的执行?(曾尝试将location ~ \.php$改为location ~ \.(php|htm|html)$但导致站点崩溃)

解决方案

一、修复/labs/ExperimentSite下PHP文件无法执行的问题

核心问题有两个:一是^~前缀的location /labs/ExperimentSite优先级高于通用的.php$正则location,导致该目录下的PHP请求不会被转发到PHP-FPM;二是配置中存在重复的.php$规则块,导致Nginx配置逻辑冲突。

具体修改步骤:

  1. 删除重复的PHP规则块
    直接删除配置中第二个多余的.php$规则块:
# 移除这段重复配置
location ~ \.php$ {
        fastcgi_split_path_info ^(/)(/.*)$;
}
  1. 修改/labs/ExperimentSite的location块
    在该块内部嵌套PHP处理规则,并更新索引和跳转逻辑:
location ^~ /labs/ExperimentSite {
        root   /app/mywebsitename/htdocs;
        index  index.html index.php;  # 添加上index.php作为默认索引文件
        auth_basic "Restricted Content";
        auth_basic_user_file /app/.htpasswd;
        
        try_files $uri $uri/ /labs/ExperimentSite/index.php?$args;  # 默认跳转改为index.php
        
        # 嵌套PHP处理规则,确保该目录下的PHP请求被转发到FPM
        location ~ \.php$ {
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass phpfpm-mywebsitename:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
                fastcgi_intercept_errors on;
        }
}

二、实现HTML中嵌入PHP代码的执行

不能直接将HTML后缀加入通用PHP规则(会导致所有HTML请求都走PHP-FPM,引发全局冲突),推荐针对/labs/ExperimentSite目录单独配置:

具体修改:

在/labs/ExperimentSite的嵌套location中添加HTML文件的PHP解析规则:

location ^~ /labs/ExperimentSite {
        root   /app/mywebsitename/htdocs;
        index  index.html index.php;
        auth_basic "Restricted Content";
        auth_basic_user_file /app/.htpasswd;
        
        try_files $uri $uri/ /labs/ExperimentSite/index.php?$args;
        
        # 处理PHP文件
        location ~ \.php$ {
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass phpfpm-mywebsitename:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
                fastcgi_intercept_errors on;
        }
        
        # 让该目录下的HTML文件解析PHP代码
        location ~ \.html$ {
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass phpfpm-mywebsitename:9000;
                include fastcgi.conf;
        }
}

配套PHP配置检查

确保PHP的php.ini文件中开启了必要选项:

short_open_tag = On  # 如果你的代码使用<? ?>标签,需要开启此选项
allow_url_include = Off  # 保持关闭,避免安全风险

内容的提问来源于stack exchange,提问作者headbanger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:15:31