如何直接使用NGINX服务所有现有的静态文件,但将其余的代理代理到后端服务器。

location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; if (-f $request_filename) { access_log off; expires 30d; break; } if (!-f $request_filename) { proxy_pass http://127.0.0.1:8080; # backend server listening break; } } 

上面将直接使用Nginx提供所有现有的文件(例如Nginx只显示PHP源代码),否则将请求转发给Apache。 我需要从规则中排除* .php文件,以便对* .php的请求也传递给Apache并进行处理。

我希望Nginx处理所有的静态文件和Apache来处理所有的dynamic的东西。

编辑:有白名单的方法,但它不是很优雅,看到所有这些扩展名,我不想这个。

 location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ { access_log off; expires 30d; } location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } 

编辑2:在较新版本的Nginx上使用try_files而不是http://wiki.nginx.org/HttpCoreModule#try_files

使用try_files和命名的位置块('@apachesite')。 这将删除不必要的正则expression式匹配,如果阻止。 更高效。

 location / { root /path/to/root/of/static/files; try_files $uri $uri/ @apachesite; expires max; access_log off; } location @apachesite { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } 

更新:这个configuration的假设是在/path/to/root/of/static/files下不存在任何php脚本。 这在大多数现代的php框架中是很常见的。 如果您的传统php项目同时在同一个文件夹中混合了php脚本和静态文件,则可能需要将所有需要nginx的文件types列入白名单。

尝试这个:

 location / { root /path/to/root; expires 30d; access_log off; } location ~* ^.*\.php$ { if (!-f $request_filename) { return 404; } proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } 

希望它有效。 正则expression式比普通string有更高的优先级,所以如果只有一个对应的.php文件存在,那么以.php结尾的所有请求都应该被redirect到Apache。 其余的将作为静态文件处理。 评估位置的实际algorithm在这里 。

如果你使用mod_rewrite来隐藏你的脚本的扩展名,或者你只是喜欢漂亮的以/结尾的URL,那么你可能想从另一个方向来解决这个问题。 告诉nginx让任何带有非静态扩展的东西通过apache。 例如:

 location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ { root /path/to/static-content; } location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ { if (!-f $request_filename) { return 404; } proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } 

我在http://code.google.com/p/scalr/wiki/NginxStaticfind了这段代码的第一部分;