Nginx一个server主机上80、433 http、https共存

如果一站点既要80 http访问,又要443https访问。

要让https和http并存,不能在配置文件中使用ssl on,配置listen 443 ssl;

实例

 

 

This request has been blocked; the content must be served over HTTPS

今天把万家店升级到了https,升级后,用https访问总是报错:

QQ20160613-0

 

当然,如果我们不方便在服务器/Nginx 上操作,也可以在页面中加入 meta 头:

<meta http-equiv=”Content-Security-Policy” content=”upgrade-insecure-requests” />

目前支持这个设置的还只有 chrome 43.0,不过我相信,CSP 将成为未来 web 前端安全大力关注和使用的内容。而 upgrade-insecure-requests 草案也会很快进入 RFC 模式。

从 W3C 工作组给出的 example(http://www.w3.org/TR/upgrade-insecure-requests/#examples),可以看出,这个设置不会对外域的 a 链接做处理,所以可以放心使用。

nginx提示No input file specified怎么办

1、 php.ini(/usr/local/php/etc/php.ini)的配置中中找到
cgi.fix_pathinfo=0
将其改成
cgi.fix_pathinfo=1
2、nginx配置文件/etc/nginx/conf/nginx.conf中注意以下部分

路径需要根据你主机主目录的实际情况填写
配置完以上部分,重启一下nginx和php-fpm,问题成功
另外,还可能跟 路径或者权限 有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因)
1)如果html也出现404错误,那么就是document root 设置的有问题
2)检查脚本文件的权限, 可能PHP或者web server不能读取它
3)SCRIPT_FILENAME设置错误
解决方法:
排除了SCRIPT_FILENAME设置错误,那问题就出现在目录文件夹及文件的权限访问上。重新设置了文件www用户组的权限,立即可以访问后台了。在这里再次特别感谢 久酷 童鞋。
设置权限的SSH命令则是

补充:我的SCRIPT_FILENAME设置参数

vim fcgi.conf (SCRIPT_FILENAME的目录)

 

 

nginx配置防盗链

应客户要求 ,网站需要配置防盗链。vps环境是lnmp。今天就把惊讶分享下

01

在网站配置文件里面添加如下代码

第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:www.aetop.net/
表示对www.aetop.net/这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回404也是可以的。

自动将Apache Rewrite伪静态规则转换为Nginx Rewrite

Nginx的Rewrite
经过网上查阅和测试,发现Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用。比如在Apache中这样写规则
rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last;
而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号:
rewrite “^/([0-9]{5}).html$” /viewthread.php?tid=$1 last;
同时将RewriteRule为Rewrite,基本就实现了Nginx的Rewrite规则到Apache的Rewite规则的转换。

Rewrite的Flags
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

官方文档请点击这里

Discuz!在Nginx下的Rewrite
需要说明的是,下网上以前一直流传的Rewrite都是有误的。
下面的Rewrite中百分号前面多了个转移字符“”,这在Apache中是需要的,而在Nginx中则是不需要的。
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
正确的应该是
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
这个错误在基本上目前所有使用Nginx作为服务器,并且开启了Rewrite的网站上存在。包括Discuz!官方,目前已经给cnteacher反馈了。

完整正确的Discuz!在Nginx下的Rewrite如下:
rewrite ^/archiver/((fid|tid)-[w-]+.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9]+)-([0-9]+).html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+).html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+).html$ /tag.php?name=$1 last;
break;

自动转换程序。

http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

此地址里面的内容包含可以完成上面说的略做修改的功能。就是把.htaccess中的规则自动转换成nginx下面可用的规则。

Nginx设置301重定向

为何要使用301重定向

在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名、网页的扩展名改变、网站域名改变等。如果不做重定向,用户的收藏和搜索引 擎数据库中的旧地址只能让访客得到一个404错误信息页面,访问流量白白丧失。不仅如此,之前该页面的一切积累(比如PR值)就都白费了。

301重定向不仅能使页面实现自动跳转,对于搜索引擎来说,也可能可以传递PR值。

nginx重定向规则详细介绍

rewrite命令
nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令格式如下:
rewrite 正则表达式 替换目标 flag标记
flag标记可以用以下几种格式:
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,$2对应第二个括号(.*)中对应的字符串:

1
2
3
location /download/ {
rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break;
}

nginx重定向的IF条件判断
在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种:
正则表达式

如:
匹配判断
~  为区分大小写匹配; !~为区分大小写不匹配
~* 为不区分大小写匹配;!~为不区分大小写不匹配
例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

1
2
3
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}

文件和目录判断
  -f和!-f判断是否存在文件
-d和!-d判断是否存在目录
-e和!-e判断是否存在文件或目录
-x和!-x判断文件是否可执行
例如下面设定nginx在文件和目录不存在的时候重定向:

1
2
3
if (!-e $request_filename) {
proxy_pass http://127.0.0.1/;
}

return
返回http代码,例如设置nginx防盗链:

1
2
3
4
5
6
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked http://www.mubansky.com/http://www.ruyidiy.com/;
if ($invalid_referer) {
return 404;
}
}

set
设置nginx变量

=============================================

301重定向方法

301重定向方法

进行了301重定向,把www .mubansky.com和mubansky.合并,并把之前的域名也一并合并. 有两种实现方法,第一种方法是判断nginx核心变量host(老版本是http_host):

1
2
3
4
#在server里面添加如下内容
if ($host != 'mubansky.com' ) {
rewrite ^/(.*)$ http://www.mubansky..com/$1 permanent;
}

第二种方法:

1
2
3
#在server里面添加如下内容
rewrite ^/(.*) http://www.mubansky.com/$1 permanent;
}

测试了第一种方法ok,这两种方法中, permanent是关键,详细说明见nginx重定向规则说明。

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

好了,现在可以检查结果,这里可以看返回的HTTP头信息:

我只测试了第一种方法,第二种自测吧。。

隐藏nginx和php版本号

[root@server etc]# curl -Ihttp://192.168.1.101
HTTP/1.1 301 Moved Permanently
Server: nginx/1.0.5
Date: Thu, 04 Aug 2011 23:54:22 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.3.6
location: forum.php
我们可以看到php版本号和nginx版本号。为了安全起见,最好去掉这些信息。
(-I/–head Show document info only)
下面说如何去掉这些信息
a.去php版本号
1、修改php.ini
[root@server etc]# vi /usr/local/php/etc/php.ini
将 expose_php = On 更改为 expose_php = Off
2、重启php
[root@server etc]# service php-fpm restart
b.去nginx版本号
1、进入nginx配置文件的目录(此目录根据安装时决定),用vi打开
[root@server conf]# vi nginx.conf
在http { }里加上server_tokens off; 如:
http {
……省略
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
server_tokens off;
…….省略
}
2、编辑php-fpm配置文件,如fastcgi.conf或fcgi.conf(这个配置文件名也可以自定义的,根据具体文件名修改):
找到:
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
改为:
fastcgi_param SERVER_SOFTWARE nginx;
3、重新加载nginx配置(nginx.pid位置根据nginx配置文件决定)
[root@server conf]# kill -HUP cat /usr/local/nginx/logs/nginx.pid
这样就完全对外隐藏了nginx版本号了,就是出现404、501等页面也不会显示nginx版本。我猜测51cto就是近期这样更改的。

看下我们更改后的效果:
[root@server conf]# curl -Ihttp://192.168.1.101
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 05 Aug 2011 00:15:00 GMT
Content-Type: text/html
Connection: keep-alive
location: forum.php