Tag: Nginx

Apache和Nginx下面如何做301重定向。

没有评论

2010 年 12 月 10 日 at 上午 11:47分类:Nginx | PHP | WEB开发

在Apache和Nginx下面如何做301重定向。

1,Apache下面可以用.htaccess设置301重定向

例如把 www.a.com 和 a.com 都301重定向到 www.b.com

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [R=301,L]

2,Nginx中进行301重定向也是非常容易的

比如域名 a.com 要重定向到 www.a.com

server {
server_name a.com;
rewrite ^(.*) http://www.a.com$1 permanent;
}

或者不是访问www.a.com的域名都转向到www.a.com

可以用:

server {
server_name a.com c.com;
if ($host != ‘www.a.com’ ) {
rewrite ^/(.*)$ http://www.a.com/$1 permanent;
}

Nginx关于虚拟主机的配置

没有评论

2010 年 11 月 12 日 at 下午 11:09分类:Nginx

Nginx首先决定一个过来的请求由哪一个server来处理。

就是:我们打开HttpWatch看到的那个HOST值。

server {

listen       80;

server_name  nginx.org  www.nginx.org;

...

}

server {

listen       80;

server_name  nginx.net  www.nginx.net;

...

}

server {

listen       80;

server_name  nginx.com  www.nginx.com;

...

}

这样的话我们就可以配置三个域名。即同一个IP绑定三个域名。如果发现有一个域名均不匹配的话就定义出来一个默认的域名

server {

listen       80 default_server;

server_name  nginx.net  www.nginx.net;

...

}

对于这种域名我们可以这样来处理

server {

listen       80 default_server;

server_name  <a href="http://www.nginx.net/">www.nginx.net</a>;     //这个值你得填写一个

return      444;

}

基于域名与IP混用的虚拟主机

server {

listen       192.168.1.1:80;

server_name  nginx.org  www.nginx.org;

...

}

server {

listen       192.168.1.1:80;

server_name  nginx.net  www.nginx.net;

...

}

server {

listen       192.168.1.2:80;

server_name  nginx.com  www.nginx.com;

...

}

至此配置完成了有关虚拟机的配置工作!

示例:

Server {

Listen          80;

Server_name     nginx.org   <a href="http://www.nginx.org/">www.nginx.org</a>;

Root            /data/www;      //这个有点相当于resin里面的root目录

Location    / {

Index   index.html  index.php;

}

Location ~*\.(gif|jpg|png)$ {

Expires 30d;

}

Location ~\.php$ {

fastcgi_pass   localhost:9000;

fastcgi_param  SCRIPT_FILENAME

$document_root$fastcgi_script_name;

include        fastcgi_params;

}

}

其中的location为”/” 表示的是它可以匹配任何请求的。

哦!原来location是用来检验URI的!

心得与笔记:

我们的server是配置HOST的即主机。

Location是配置URI的。

比如:http://www.sina.cn/blog/index.php  那这里面的HOST就是www.sina.cn

URI就是我们的/blog/index.php值了。

一个“/logo.gif”请求会先和字符location“/”匹配,然后再和正则表达式“\.(gif|jpg|png)$”匹配, 因此,它是被字符location处理的。指令“root /data/www”会使该请求指向一个文件 “/data/www/logo.gif”,之后这个文件就会发送到客户端。

哦原来root的作用其实与resin里面的document-root是一个概念的!

一个 “/index.php”请求同样先被字符location “/” 匹配,然后才被正则表达式“\.(php)$”匹配。 所以, 它是被字符location所处理的,并且这请求是通过一个监听在localhost:9000的FastCGI server被处理的. “fastcgi_param” 指令设置FastCGI的参数SCRIPT_FILENAME设置为“/data/www/index.php”, FastCGI server 执行这个文件. $document_root 变量的值等于 “root” 指令,$fastcgi_script_name 变量等于 URI 请求的值, 也就是 “/index.php”.

笔记:nginx是让客户端程序找到文件的目录位置。具体如何处理这个得让后端来处理的

一个 “/about.html”请求只被字符location“/”匹配, 所以,它被这个location处理。 使用“root /data/www” 指令的时候,该请求会被转到 “/data/www/about.html”, 并且文件会被发送到客户端。

明白了!

笔记:location是得讲个先后顺序才行的。即先由 location / 处理让客户端找到所需要的文件。然后再往下找看看是否还有匹配的location项如果像php文件就会有了!

丢给了一个FAST-CGI处理程序

总结:

心得与笔记:

我们的server是配置HOST的即主机。多个域名就定义多个虚拟主机即可

Location是配置URI的。

比如:http://www.sina.cn/blog/index.php  那这里面的HOST就是www.sina.cn

URI就是我们的/blog/index.php值了。

Location是多方匹配的。示例:

Location    / {

Index   index.html  index.php;

}

Location ~*\.(gif|jpg|png)$ {

Expires 30d;

}

如果我请求一个abc.gif的话是先由第一个UIR定位找到图片位置再由第二个URI处理得到过期时间。

当然在location里面有以下几个选项。

1、last 基本上用这个。表示已完成了rewrite不再匹配后面的规则了

2、break    中止rewrite不再继续匹配

3、redirect 返回临时重定向的HTTP状态302

4、permanent    返回永久重定向的HTTP状态301

注意:原有的URL支持正则,重写的URL不支持正则

Location    / {

Index   index.html  index.php;

Break;

}

则后面的过期限制就不生效

手工测试一下:只处理静态文件的情况

站点目录:

虚拟主机1:目录放在D:\myweb\proj3 下面

虚拟主机2:目录放在D:\myweb\proj4 下面

server {

listen 80;

server_name www.aaa.com;

root    D:\myweb\proj3;

location / {

index index.html index.htm;

}

location ~*\.(gif|jpg|png)$ {

expires  30d;

}

}

server {

listen 80;

server_name www.bbb.com;

root    D:\myweb\proj4;

location / {

index index.html index.htm;

}

location ~*\.(gif|jpg|png)$ {

expires  30d;

}

}

OK!配置了两个虚拟主机了。到时只要域名一过来就可以解析。

Nginx的Rewrite配置

2010 年 11 月 12 日 at 下午 10:03分类:Nginx

在Nginx的服务器环境中!因为该服务器不支持PATH_INFO的方式进行URL路由的的设置

因此我们启用Nginx的Rewrite模式来设置我们想要的URL模式:

具体的配置方式和Apache的配置方式是一样的!只要我们在Nginx的配置文件nginx.conf的服务(server)

里面添加相关的代码就行了,我们把配置Rewrite的规则放在43行的location里面,至于为什么放在这里,

那是因为只有在这里,匹配的时候是没有判断文件的拓展名,而在其他的location里面是有判断文件的拓展名的,

甚至有些还会对文件进行过滤!因此我们将我们的Rewrite规则放在43行处location中,当然你自己另外写一个

类似的locaton也是可以的!

一帮情况下,我们会把我们的规则放在if条件判断里面,这样子做是为了更安全,更清晰的匹配规则!

如下:

if (!-e $request_filename) {

#Nginx伪静态的配置
rewrite “^/bin-(\w*)\.html$” /index.php?a=$1 last;
break;
}

这样子一来:我们就可以用这样子的地址链接来访问index.php了
index.php中的代码:

<?
echo $_GET['a'];
 echo “<br />”;
?>

这样我们输出来的结果就是12345了
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;

同时将Apache的RewriteRule改为Nginx的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&amp;amp;extra=page\%3D$3&amp;amp;page=$2 last;

正确的应该是

rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&amp;amp;extra=page%3D$3&amp;amp;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&amp;amp;extra=page%3D$3&amp;amp;page=$2 last;
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;
break;

下面是一些主流程序的 Rewrite的写法:

http://www.vpser.net/manage/nginx-rewrite.html

Nginx配置文件中的一些知识点:

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断(待补全)
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

修改NGINX配置完美支持PATH_INFO路由模式

没有评论

2010 年 11 月 12 日 at 上午 10:17分类:Nginx | WEB开发

  1. location ~ \.php
  2. {
  3. fastcgi_index index.php;
  4. fastcgi_pass 127.0.0.1:9000;
  5. include fastcgi_params;
  6. set $path_info “”;
  7. set $real_script_name $fastcgi_script_name;
  8. if ($fastcgi_script_name ~ “^(.+?\.php)(/.+)$”) {
  9. set $real_script_name $1;
  10. set $path_info $2;
  11. }
  12. fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
  13. fastcgi_param SCRIPT_NAME $real_script_name;
  14. fastcgi_param PATH_INFO $path_info;
  15. }
    ++++++++++++++++++++++++++++++++++++++++++++++++
  1. location ~* .*\.php($|/)
  2. {
  3. fastcgi_split_path_info ^(.+\.php)(.*)$;
  4. fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  5. fastcgi_param PATH_INFO $fastcgi_path_info;
  6. fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  7. if ($request_filename ~* .*\.php$) {
  8. set $is_path_info ’0′;
  9. }
  10. if (-e $request_filename) {
  11. set $is_path_info ’1′;
  12. }
  13. if ($is_path_info ~ ’0′) {
  14. return 403;
  15. }
  16. }
    NGINX环境下不支持PATH_INFO导致PHP框架开发的网站不能使用解决办法
    目前大部分PHP框架都是以PATH_INFO路由模式为默认模式,但nginx默认是不支持path_info路由模式【0.7.3版前部支持PATH_INFO路由模式】,那么如何修改其配置支持PATH_INFO模式呢?

    修改NGINX配置文件,在http段或者server段加入上面所示的代码!

    修改完毕后用nginx自带的配置检测命令检测是否正确,如正确,重启nginx即可

Windows环境下Nginx安装配置教程

一条评论

2010 年 09 月 10 日 at 下午 10:29分类:乱七八糟

http://www.ruanjian5.com/software/51/n-1351.html

Nginx是一款和Appahe和IIS一样的HTTP服务器软件,网上对这款由Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的HTTP服务器软件评价很高。 据称国内有几个门户网(新浪、网易、腾讯)都投入了Nginx的怀抱,至于Nginx是不是真的这么有魅力,我非专业人士无法给大家一个测评报道,而Nginx的详细介绍大家可以去百度百科去了解了下。(Nginx百科地址:http://baike.baidu.com/view/926025.htm。) 虽然非专业人士,但今天给大家带来的是Nginx的Windows环境下的安装配置教程,但是根据前辈们的经验,Nginx运行于Unix或Linux效率会更佳。 1.首先去下载最新版本的Nginx,Nginx下载地址:http://xiazai.zol.com.cn/detail/38/373405.shtml(这是windows版本,用Linux版本的不用我教大家上那下载吧)。 2.将下载的Nginx解压包解压,就可以看到Nginx的Windows下的主程序“Nginx.exe” 了,一般来说双击鼠标并运行这个程序,那么Nginx就成功安装了。 这是使用IE浏览器打开“http://127.0.0.1或http://localhost”后的效果图,代表安装成功。 当然这只代表Nginx安装成功,以下还需要对Nginx进行简单的配置。 3.进入Nginx主文件夹里的conf文件夹,找到“Nginx.conf”使用记事本之类的软件打开该文件。 Nginx.conf的第44行(行数如不同请参考上面的Server{)会看到”root html”我们只需后面的html改成自己的web目录就行了。 最后就是修改一下Nginx.exe为自动启动,因为nginx不是自动启动的,我们只需将其拖动到Windows菜单的启动菜单里就行了。 点评: 本文只是说了如何安装和配置Nginx,下次再说下如何配置Nginx+PHP。