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

Nginx代理Apache+PHP服务时CSS与图片无法加载的解决求助

问题描述

本地服务service1.mydomain.local(基于Apache+PHP)在内网访问完全正常,但通过外网域名service1.mydomain.com经Nginx代理访问时,仅PHP相关内容可正常加载,CSS、图片等静态资源无法显示。当前配置如下:

Nginx配置

server {
listen 80;
server_name service1.mydomain.com;
include snippets/letsencrypt.conf;

location / {
    return 301 https://$server_name$request_uri;
}
}

server {
listen 443 ssl http2;
server_name service1.mydomain.com;
include snippets/letsencrypt.conf;

ssl_certificate /etc/letsencrypt/live/service1.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/service1.mydomain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/service1.mydomain.com/chain.pem;

access_log /var/log/nginx/service1.access.log;
error_log /var/log/nginx/service1.error.log info;

location / {
    try_files $uri $uri/ /index.php?/$request_uri; #/index.php$args;
}

location ~ \.php$ {
proxy_pass http://service1.mydomain.local:80;
proxy_set_header Host service1.mydomain.local;  #$host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location ~ /\. {
             deny all;
    }

}

Apache配置

<VirtualHost *:80>
    ServerName service1.mydomain.local

    DocumentRoot /usr/share/self-service-password/htdocs
    DirectoryIndex index.php

    AddDefaultCharset UTF-8

    <Directory /usr/share/self-service-password/htdocs>
        AllowOverride None
        <IfVersion >= 2.3>
            Require all granted
        </IfVersion>
        <IfVersion < 2.3>
            Order Deny,Allow
            Allow from all
        </IfVersion>
    </Directory>

    Alias /rest /usr/share/self-service-password/rest

    <Directory /usr/share/self-service-password/rest>
        AllowOverride None
        <IfVersion >= 2.3>
            Require all denied
        </IfVersion>
        <IfVersion < 2.3>
            Order Deny,Allow
            Deny from all
        </IfVersion>
    </Directory>

    LogLevel warn
    ErrorLog /var/log/apache2/ssp_error.log
    CustomLog /var/log/apache2/ssp_access.log combined
</VirtualHost>
问题原因与修复方案

问题根源是当前Nginx配置仅代理了.php后缀的请求,静态资源请求(如.css、.png等)被Nginx自身处理,但Nginx本地没有这些文件,导致返回404错误,最终无法加载。

有两种修复方式:

方式一:全局代理所有请求(推荐)

直接将根location的逻辑改为代理所有请求到后端Apache,这样静态资源和PHP请求都会被正确转发:

修改后的Nginx配置:

server {
listen 80;
server_name service1.mydomain.com;
include snippets/letsencrypt.conf;

location / {
    return 301 https://$server_name$request_uri;
}
}

server {
listen 443 ssl http2;
server_name service1.mydomain.com;
include snippets/letsencrypt.conf;

ssl_certificate /etc/letsencrypt/live/service1.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/service1.mydomain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/service1.mydomain.com/chain.pem;

access_log /var/log/nginx/service1.access.log;
error_log /var/log/nginx/service1.error.log info;

# 代理所有请求到后端Apache
location / {
    proxy_pass http://service1.mydomain.local:80;
    proxy_set_header Host service1.mydomain.local;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location ~ /\. {
    deny all;
}

}

方式二:单独代理静态资源

如果不想全局代理,可新增一个location块专门匹配静态资源后缀,将这些请求转发到Apache:

在Nginx的443 server块中添加以下配置:

# 代理静态资源请求
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
    proxy_pass http://service1.mydomain.local:80;
    proxy_set_header Host service1.mydomain.local;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    # 可选:添加缓存策略优化加载速度
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

修改完成后,重启Nginx服务即可生效:

sudo systemctl restart nginx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 23:00:01