Nginx系列教程:faq整理

faq中大部分问题来自http://www.stackoverflow.com与http://www.serverfault.com,有些可能未经过本人验证。

Nginx如何替换错误

Q:能否用503错误(负载过高或临时不可用)来代替502错误作为应答返回?
A:配置fastcgi_intercept_errors指令并将其设置为on,然后使用error_page指令:

location / { fastcgi_pass 127.0.0.1:
9001; fastcgi_intercept_errors on; error_page 502 =503 /error_page.html; # ...}

Nginx如何重写404到其他页面

Q:能否将请求的不存在文件重写到index.php?
A:使用try_files指令:

try_files $uri $uri/ /index.php

$uri与$uri/将判断请求的uri是否为一个存在的文件或目录,如果不是,将被重写到最后一个参数,即index.php

Nginx如何为代理的请求保存请求的Host头

Q:当使用nginx的proxy_pass代理一个后端的服务器(应用)时,如果后端服务器有多个虚拟主机,代理请求并不能产生正确的应答(nginx发起的请求中没有Host请求头),如何解决这个问题?
A:使用proxy_set_header指令设置主机头:

location / { proxy_pass http://my_app_upstream; proxy_set_header Host $host; # ...}

怎么配置nginx rewrite,才不会引起浏览器url地址重定向?

Q:Apache重写规则中的P参数代表为强制代理,即使用这个参数可以讲一个域名重写到另一个域名而不引起浏览器地址栏的url变化,Nginx中如何实现这一功能?
A:使用rewrite与proxy_pass配合:

location ~ ^/frompath/ { rewrite ^/frompath/(.*)$ /topath/$1 break; proxy_pass http://www.domain.com; }

假如请求为http://www.test.com/frompath/page.php,将被重写到http://www.domain.com/topath/page.php而不引起浏览器地址栏中url的变化

如何重写带参数的uri?

Q:如何使用Nginx重写/test.php?id=1&action=delete到/action.php?id=1&action=delete
A:参数保存在变量$query_string中,默认参数会跟在重写后的url后面,可以在新的规则后面加个问号:

set $query $query_string;rewrite /test.php /action.php?$query?;

如果要求重写后的参数与重写前的参数不同,可以针对$query_string变量做正则匹配并配合set设置变量,这样就可以在重写规则中使用它们了。

时间: 2024-10-15 05:45:59

Nginx系列教程:faq整理的相关文章

Nginx系列教程:常见问题(FAQ)

某些东东不工作 (URL重写, 代理, 路径, ...) 例如: 如URL重写(rewrite)不工作了或者是unix的路径(/$PATH)的问题云云... 请仔细阅读 [Nginxhttp://www.aliyun.com/zixun/aggregation/10818.html">Debugging] 并且 逐行 查看错误日志.如果你没找到错误 打起精神 试着到IRC或邮件列表里说明一下你碰到的问题. 有没有其它类似的Web服务器 Cherokee Lighttpd (Lighty)

Nginx系列教程:Nginx二级子域名完美方案

对于批量添加http://www.aliyun.com/zixun/aggregation/14840.html">虚拟主机的需求,Apache 有 vhost_alias 模块帮忙.Nginx 呢? 其实神马都不需要, 同样可以实现 Nginx 二级域名匹配子文件夹,且不匹配 "www",但可以匹配包含 "www" 的子域名. 首先看看目前网上搜到的方法. if ( $host ~* (.*)\.(.*)\.(.*)) { set $subdoma

Nginx系列教程:关于Nginx的SSI(包含路径)

如果shtml里面的网页代码包含语句写成如下: <!--#include virtual="/test.html"--> 这样是没有问题,可以包含的,但是如果写成这样: <!--#include virtual="../test.html"--> 由于需要包含当前代码文件所在目录路径的上级目录文件,nginx会为此请求产生的子请求uri为/../test.html,默认nginx会认为这个uri并不是安全的,日志(error_log)会输入如

Nginx系列教程:HTTP Upstream Request Hash模块

ngx_http_upstream_hash_module 本模块由第三方提供,不包含在 Nginx 的源码发布版中. upstream_hash该模块提供了简单的上游负载分配,通过散列一个可配置的变量(例如,请求URI,传入的HTTP标头或一些组合).用法示例如下: upstream backend {: server server1;: server server2;: hash $request_uri;} 在这里,nginx将通过散列请求的URI($ REQUEST_URI)选择Serv

Nginx系列教程:在server_name指令中使用正则表达式

server_http://www.aliyun.com/zixun/aggregation/11696.html">name的匹配顺序 nginx中的server_name指令主要用于配置基于名称虚拟主机,server_name指令在接到请求后的匹配顺序分别为:1.准确的server_name匹配,例如: server { listen 80; server_name howtocn.org www.howtocn.org; ...} 2.以*通配符开始的字符串: server { li

Nginx系列教程:HTTP OwnerMatch模块

我编写了一个 Nginx 模块 HTTP OwnerMatch 解决了 Nginx http://www.aliyun.com/zixun/aggregation/14840.html">虚拟主机间可通过链接型文件(硬链接和符号链接)跨站访问的问题.通过这个模块可以指定每个虚拟主机的每个 Location 可以或不可以访问的哪些用户的文件. 配置文件实例 location / { root html; index index.html index.htm; omallow heiher;

Nginx系列教程:X-Accel-Redirect

基于应用程序的header来发送静态文件的特性叫做 X-Sendfile. Lighttpd 有该特性,apache也有个模块 叫 mod_xsendfile . Nginx也有该功能,但实现得稍微有些不同.Ngnix该功能叫做X-Accel-Redirect. 主要有两个不同之处: header 必须包含 URI location 必须 被定义为 internal; 以阻止客户端直接访问该 URI Nginx 配置样例: location /protected/ { internal; roo

Nginx系列教程:Http Access Key模块

此模块没有被包含在Nginx官方安装包中. 这个模块可以阻止所有URL中未包含合法访问令牌的访问(防盗链).访问令牌可以由访问者IP或者其它服务器变量生成,所以可以很好地控制客户端的下载行为. 配置实例: location /download {&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; accesskey             on;  accesskey_hashmethod  md5;  access

Nginx系列教程:nginx_substitutions_filter模块

nginx_substitutions_filter 请注意:此模块不是Nginx源的分布,可点击此链接找到安装说明, http://wiki.nginx.org/NginxHttpSubsModule#Installation . 概述 nginx_substitutions_filter 是一个过滤器模块,它可以在响应主体上运行正则表达式和固定字符串替换.该 模块不同于Nginx的本地替代模块.它能够扫描输出链缓冲区和匹配逐行字符串,类似于http://www.aliyun.com/zixu