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
相关产品推荐
相关产品推荐

