nginx带问号(?)带参数的rewrite规则的书写方法,很不错的文章,感兴趣的朋友可以参考下。
今天收到一个需求,要根据程序员的需要给定php的参数来跳转到指定的页面,安装常规的rewrite规则,如:rewrite ^/change.php?id=weibo http://www.weibo.com/; (错误的示范)
这样的跳转起不了左右,因为nginx会把后面的一整串都认为是URL,但是在浏览器上去,只会访问到change.php这个文件。
那只能想别的方法了,仔细看了nginx的各项参数,注意到里面的
$query_string 解释:请求行中(GET请求)的参数;(配置1)
$request_uri 解释:包含请求参数的原始URI,不包含主机名,如:"/change.php?id=163",不能修改。
(配置2)
那我们就根据参数来判断是否要跳转。
配置如下
(配置1):
方便复制:
if ( $query_string ~ "id=(baidu)(.*)$" )
{
rewrite ^/css/style.css http://www.baidu.com/;
}
if ( $query_string ~ "id=(qq|QQ)(.*)$" )
{
rewrite ^/ http://www.qq.com/;
}
(配置2):
方便复制:
if ( $request_uri ~ "/(.*).html\?id=163" )
{
rewrite ^/ http://www.163.com/;
}
# 直接跳转到163 ;
if ( $request_uri ~ "/(.*).html\?id=sohu" )
{
rewrite ^/(.*).html /css/style.css;
}
# *.html?id=sohu 跳转到/css/style.css;伪静态
测试:
1,测试跳转到百度:
2,测试跳转到QQ:
3,测试跳转到微博:
4,测试跳转到163:
从测试结果来看,配置成功。
原文作者:李坤山
博客链接:http://blog.163.com/a12333a_li/
今天收到同事的一个需求,在web生成的统计日志中不要记录action.php、soft.php、new.php,logo.jpg这三个php文件和logo文件的日志,降低统计时候读取日志消耗的性能,本来以后直接加个location 就可以搞定,后来发现并不是这么简单;
错误配置:
这样的配置,发现只有访问logo.jpg的日志被记录到data.log.no的日志中,*.php的日志依然被记录到data.log日志中。
理解:因为在加进去的规则前面有个localtion ~ .*\.php?$ 所以php文件一进来就被这个location规则给匹配了,并没有经过我们后来定义的那个规则里面,所以日志还是记录在data.log里面。而logo.jpg则匹配后来的规则,所以被记录。
于是,把规则提到最前面,让他优先匹配(错误配置)
日志是被记录了,可是php文件 不能访问,直接会提示下载,这样的配置php没有发送给后端的php-cgi处理,把php的处理也加进去试试。
解决方法(注意location的顺序):
重启nginx,日志记录分开了。
作者:李坤山
博客链接:http://blog.163.com/a12333a_li/
环境:nginx 1.0.10
今天调试一个站点时,发现用post方式去请求一个静态页面时,返回 HTTP/1.1 405 Method not allowed 状态,无法正常显示页面。
这里提供下网上的一些解决方法,供大家参考。
方法一
{
listen 80;
server_name test.baidu.com;
index index.html index.htm index.php;
root /www/test.baidu.com;
error_page 405 =200 @405;
location @405
{
root /www/test.baidu.com;
}
location ~ .*.php?$
{
include conf/fcgi.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
}
备注:用在我的环境无法解决。
方法二
编辑nginx源代码
vi /root/soft/nginx1.0.10/src/http/modules/ngx_http_static_module.c
/*
if (r->method & NGX_HTTP_POST) {
return NGX_HTTP_NOT_ALLOWED;
}
*/
然后按照原来的编译参数 ./configuer make 不用make install 否则会覆盖原来的一些配置文件。
执行
cp ./objs/nginx $nginx_dir/sbin/nginx
$nginx_dir/sbin/nginx -s reload
备注:用在我的环境无法解决。
方法三
{
listen 80;
server_name test.baidu.com;
index index.html index.htm index.php;
root /www/test.baidu.com;
location /
{
root /www/test.baidu.com;
error_page 405 =200 http://$host$request_uri;
}
location ~ .*.php?$
{
include conf/fcgi.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
}
备注:用在我的环境可以解决。