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配置逻辑冲突。
具体修改步骤:
- 删除重复的PHP规则块
直接删除配置中第二个多余的.php$规则块:
# 移除这段重复配置 location ~ \.php$ { fastcgi_split_path_info ^(/)(/.*)$; }
- 修改/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
相关产品推荐
相关产品推荐

