为何Nginx服务器中子文件夹的nginx.conf重写规则被忽略?
Nginx子目录dummyimage重写规则失效解决方法
问题背景
在WordPress的子文件夹中部署dummyimage占位图生成工具,子目录根目录的nginx.conf负责将所有请求转发到同目录的code.php?x=....。此前在Apache服务器上,等效的.htaccess文件运行正常,但切换到Nginx后,子目录内的重写规则完全失效,切回Apache则恢复正常。
问题原因
- Nginx不自动加载子目录配置:Apache支持每个目录放置.htaccess并自动读取,但Nginx默认不会加载子目录下的nginx.conf,必须在主配置中显式引入或直接将规则写入主配置。
- 路径匹配错误:原配置中的重写规则使用根路径
/作为匹配起点,但工具部署在子目录下,所有请求路径都包含子目录前缀,原规则无法匹配到这些请求。 - 重写目标路径错误:原规则中转发的
/code.php是根路径下的文件,而非子目录内的code.php,导致请求转发到错误位置。
修正后的Nginx配置示例
假设工具部署在子目录/dummy/(请替换为实际子目录名),将以下规则添加到WordPress站点的主Nginx配置中:
# Nginx Rewrite rules for dummyimage (部署在/dummy/子目录) location ^~ /dummy/ { # 处理数字开头的尺寸请求,比如/dummy/123x456.jpg rewrite ^/dummy/([\d].*) /dummy/code.php?x=$1$args last; # 标准广告尺寸别名规则 # Square Pop Up 250x250 rewrite ^/dummy/(s\w+pop)(.*) /dummy/code.php?x=250x250$2 last; # Vertical Banner 120x240 rewrite ^/dummy/(ver\w+ban)(.*) /dummy/code.php?x=120x240$2 last; # Full Banner 468x60 rewrite ^/dummy/(f\w+ban)(.*) /dummy/code.php?x=468x60$2 last; # Half Banner 234x60 rewrite ^/dummy/(h\w+ban)(.*) /dummy/code.php?x=234x60$2 last; # Micro Bar 88x31 rewrite ^/dummy/(m\w+bar)(.*) /dummy/code.php?x=88x31$2 last; # Button 1 120x90 rewrite ^/dummy/(b\w+1)(.*) /dummy/code.php?x=120x90$2 last; # Button 2 120x60 rewrite ^/dummy/(b\w+2)(.*) /dummy/code.php?x=120x60$2 last; # Square Button 125x125 rewrite ^/dummy/(s\w+but)(.*) /dummy/code.php?x=125x125$2 last; # Leaderboard 728x90 rewrite ^/dummy/(lea\w+rd)(.*) /dummy/code.php?x=728x90$2 last; # Wide Skyscraper 160x600 rewrite ^/dummy/(w\w+sk\w+r)(.*) /dummy/code.php?x=160x600$2 last; # Skyscraper 120x600 rewrite ^/dummy/(sk\w+r)(.*) /dummy/code.php?x=120x600$2 last; # Half Page Ad 300x600 rewrite ^/dummy/(h\w+g)(.*) /dummy/code.php?x=300x600$2 last; # Medium Rectangle 300x250 rewrite ^/dummy/(me)\w+(rec\w+)(.*) /dummy/code.php?x=300x250$3 last; # Vertical Rectangle 240x400 rewrite ^/dummy/(ver)\w+(rec)(.*) /dummy/code.php?x=240x400$3 last; # Large Rectangle 336x280 rewrite ^/dummy/(large|lrg)(rec)(.*) /dummy/code.php?x=336x280$3 last; # Rectangle 180x150 rewrite ^/dummy/(rec)(.*) /dummy/code.php?x=180x150$2 last; # Pop Under 720x300 rewrite ^/dummy/(pop)(.*) /dummy/code.php?x=720x300$2 last; # 显示标准别名规则 # CGA 320x200 rewrite ^/dummy/(cga)(.*) /dummy/code.php?x=320x200$2 last; # QVGA 320x240 rewrite ^/dummy/(qvga)(.*) /dummy/code.php?x=320x240$2 last; # VGA 640x480 rewrite ^/dummy/(vga)(.*) /dummy/code.php?x=640x480$2 last; # WVGA 800x480 rewrite ^/dummy/(wvga)(.*) /dummy/code.php?x=800x480$2 last; # SVGA 1024x600 rewrite ^/dummy/(svga)(.*) /dummy/code.php?x=1024x600$2 last; # WSVGA 1024x600 rewrite ^/dummy/wsvga(.*) /dummy/code.php?x=1024x600$1 last; # XGA 1024x768 rewrite ^/dummy/(xga)(.*) /dummy/code.php?x=1024x768$2 last; # WXGA 1280x800 rewrite ^/dummy/(wxga)(.*) /dummy/code.php?x=1280x800$2 last; # WSXGA 1440x900 rewrite ^/dummy/(wsxga)(.*) /dummy/code.php?x=1440x900$2 last; # WUXGA 1920x1200 rewrite ^/dummy/(wuxga)(.*) /dummy/code.php?x=1920x1200$2 last; # WQXGA 2560x1600 rewrite ^/dummy/(wqxga)(.*) /dummy/code.php?x=2560x1600$2 last; # 视频标准别名规则 # NTSC 720x480 rewrite ^/dummy/(ntsc)(.*) /dummy/code.php?x=720x480$2 last; # PAL 768x576 rewrite ^/dummy/(pal)(.*) /dummy/code.php?x=768x576$2 last; # HD720 1280x720 rewrite ^/dummy/(hd720)(.*) /dummy/code.php?x=1280x720$2 last; # HD1080 1920x1080 rewrite ^/dummy/(hd1080)(.*) /dummy/code.php?x=1920x1080$2 last; # 处理图片后缀请求,若文件不存在则转发到code.php location ~* \.(png|jpg|jpeg|gif)$ { try_files $uri /dummy/code.php?x=$uri$args; } # 捕获404请求,转发到code.php处理 error_page 404 = @dummy404; } location @dummy404 { rewrite ^/dummy/(.*) /dummy/code.php?x=$1$args last; }
关键修改说明
- 统一子目录前缀:所有规则都添加了
/dummy/前缀(替换为实际子目录名),确保匹配子目录下的请求。 - 合并location块:将原配置中分散的location块合并到主
/dummy/的location下,避免Nginx匹配优先级问题。 - 修正重写目标路径:所有转发目标都指向子目录内的
/dummy/code.php,而非根路径。 - 添加
last标记:每个rewrite规则末尾添加last,确保Nginx处理完当前规则后停止匹配其他规则,避免冲突。 - 调整图片请求处理:将原独立的图片location合并到子目录规则内,确保子目录下的图片请求被正确处理。
内容的提问来源于stack exchange,提问作者Norman
相关产品推荐
相关产品推荐

