Nginx反向代理Docker化Apache版WordPress出现"Bad Request"错误
我搭建了Nginx服务器作为反向代理,指向运行Apache的Docker化WordPress实例,Nginx SSL配置如下:
server { server_name blog.example.com; listen 443 ssl; listen [::]:443 ssl; ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://127.0.0.1:8020; include proxy_params; proxy_set_header Host $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; } } server { server_name blog.example.com; listen 80; listen [::]:80; if ($host = blog.example.com) { return 301 https://$host$request_uri; } return 404; }
访问blog.example.com时,收到来自Docker容器内Apache的错误:
Bad Request Your browser sent a request that this server could not understand.
已确认Nginx代理头设置,检查过容器内的.htaccess和Apache配置,仍未找到根本原因。
排查思路及解决方向
检查Apache虚拟主机的ServerName配置
Docker容器内的Apache虚拟主机需匹配请求的Host头。确保Apache配置中的ServerName或ServerAlias包含blog.example.com,或者设置为*允许任意Host头匹配。排查Nginx proxy_params文件的冲突
你在location中同时include proxy_params又手动设置了Host等头信息,可能存在重复定义。查看/etc/nginx/proxy_params内容,若其中已包含proxy_set_header Host $host;,建议移除手动重复设置的项,避免头信息异常。验证Docker端口映射有效性
确认容器的80端口已正确映射到宿主机8020端口,且容器内Apache确实监听80端口。在宿主机执行curl http://127.0.0.1:8020,若直接访问也报错,说明问题出在容器内的Apache配置。检查Apache的请求头限制
部分Apache模块(如mod_security)可能拦截不符合规则的请求头,或配置中对Host头有严格限制。可临时关闭mod_security测试,或在Apache配置中添加AllowEncodedSlashes On(若请求含特殊字符),同时检查httpd.conf中的HostnameLookups设置。查看Apache错误日志获取细节
进入Docker容器,查看Apache错误日志(通常路径为/var/log/apache2/error.log),日志会记录具体错误原因(如Host头不匹配、请求格式错误等),这是定位问题最直接的方式。
内容的提问来源于stack exchange,提问作者simplesystems

