在linux服务器nginx环境下rewrite规则怎么写
nginx虚拟主机配置实例
1、在/usr/local/nginx/conf/nginx.conf文件末尾加入虚拟主机配置,实例如下:
server
{
listen 80;
server_name your_domain_name
index index.html index.htm index.php;
root /wwwroot/your_web_directory
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
#include rewite rule file or you can directly write here
include rewrite.conf;
log_format hebaodanscom ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
access_log /logs/hebaodanscom.log hebaodanscom;
}
2、vi /usr/local/nginx/conf/rewrite.conf 输入以下规则:
location / {
if (!-e $request_filename)
{
#————START —————WORLDPRESS————
rewrite ^ /index.php last;
#————END —————WORLDPRESS————
#————————zen-cart start——————
# From Ultimate SEO URLs
rewrite "^(.*)-p-(.*).html" /index.php?main_page=product_info&products_id=$2&% last;
rewrite "^(.*)-c-(.*).html" /index.php?main_page=index&cPath=$2&% last;
rewrite "^(.*)-m-([0-9]+).html" /index.php?main_page=index&manufacturers_id=$2&% last;
rewrite "^(.*)-pi-([0-9]+).html" /index.php?main_page=popup_image&pID=$2&% last;
rewrite "^(.*)-pr-([0-9]+).html" /index.php?main_page=product_reviews&products_id=$2&% last;
rewrite "^(.*)-pri-([0-9]+).html" /index.php?main_page=product_reviews_info&products_id=$2&% last;
# For Open Operations Info Manager
rewrite "^(.*)-i-([0-9]+).html" /index.php?main_page=info_manager&pages_id=$2&% last;
# For dreamscape’s News & Articles Manager
rewrite "^news/?" /index.php?main_page=news&% last;
rewrite "^news/rss.xml" /index.php?main_page=news_rss&% last;
rewrite "^news/archive/?" /index.php?main_page=news_archive&% last;
rewrite "^news/([0-9]{4})-([0-9]{2})-([0-9]{2}).html" /index.php?main_page=news&date=$1-$2-$3&% last;
rewrite "^news/archive/([0-9]{4})-([0-9]{2}).html" /index.php?main_page=news_archive&date=$1-$2&% last;
rewrite "^news/(.*)-a-([0-9]+)-comments.html" /index.php?main_page=news_comments&article_id=$2&% last;
rewrite "^news/(.*)-a-([0-9]+).html" /index.php?main_page=news_article&article_id=$2&% last;
# All other pages
# Don’t rewrite real files or directories
#RewriteCond %{REQUEST_FILENAME} !-f [NC]
#RewriteCond %{REQUEST_FILENAME} !-d
rewrite "^(.*).html" /index.php?main_page=$1&% last;
#—————————-zen-cart end—————–
}
}
保存后,运行 kill -HUP `cat /usr/local/nginx/nginx.pid` 平滑重启即可生效。
一.正则表达式匹配,其中:
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
二.文件及目录匹配,其中:
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
三.rewrite指令的最后一项参数为flag标记,flag标记有:
1.last 相当于apache里面的[L]标记,表示rewrite。
2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3.redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
4.permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。
使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。
例如:如果我们将类似URL/photo/123456 重定向到/path/to/photo/12/1234/123456.png
rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png ;
四.NginxRewrite 规则相关指令
1.break指令
使用环境:server,location,if;
该指令的作用是完成当前的规则集,不再处理rewrite指令。
2.if指令
使用环境:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
二.文件及目录匹配,其中:
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
三.rewrite指令的最后一项参数为flag标记,flag标记有:
1.last 相当于apache里面的[L]标记,表示rewrite。
2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3.redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
4.permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。
使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。
例如:如果我们将类似URL/photo/123456 重定向到/path/to/photo/12/1234/123456.png
rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png ;
四.NginxRewrite 规则相关指令
1.break指令
使用环境:server,location,if;
该指令的作用是完成当前的规则集,不再处理rewrite指令。
2.if指令
使用环境:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
3.return指令
语法:returncode ;
使用环境:server,location,if;
该指令用于结束规则的执行并返回状态码给客户端。
示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
location ~ .*\.(sh|bash)?$
{
return 403;
}
4.rewrite 指令
语法:rewriteregex replacement flag
使用环境:server,location,if
该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,示例如下:
if( $host ~* www\.(.*) )
{
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1permanent;
}
5.Set指令
语法:setvariable value ; 默认值:none; 使用环境:server,location,if;
该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。
示例:set$varname "hello world";
6.Uninitialized_variable_warn指令
语法:uninitialized_variable_warnon|off
使用环境:http,server,location,if
该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。
五.Nginx的Rewrite规则编写实例
1.当访问的文件和目录不存在时,重定向到某个php文件
if( !-e $request_filename )
{
rewrite ^/(.*)$ index.php last;
}
2.目录对换 /123456/xxxx ====> /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
3.如果客户端使用的是IE浏览器,则重定向到/ie目录下
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}
4.禁止访问多个目录
location ~ ^/(cron|templates)/
{
deny all;
break;
}
5.禁止访问以/data开头的文件
location ~ ^/data
{
deny all;
}
6.禁止访问以.sh,.flv,.mp3为文件后缀名的文件
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}
7.设置某些类型文件的浏览器缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)$
{
expires 1h;
}
8.给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志
location ~(favicon.ico) {
log_not_found off;
expires 99d;
break;
}
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}
9.设定某个文件的过期时间;这里为600秒,并不记录访问日志
location ^~ /html/scripts/loadhead_1.js {
access_log off;
root /opt/lampp/htdocs/web;
expires 600;
break;
}
10.文件反盗链并设置过期时间
这里的return412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
“rewrite ^/ http://img.linuxidc.net/leech.gif;”显示一张防盗链图片
“access_log off;”不记录访问日志,减轻压力
“expires 3d”所有文件3天的浏览器缓存
location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.linuxidc.com*.linuxidc.net localhost 208.97.167.194;
if ($invalid_referer) {
rewrite ^/ http://img.linuxidc.net/leech.gif;
return 412;
break;
}
access_log off;
root /opt/lampp/htdocs/web;
expires 3d;
break;
}
11.只允许固定ip访问网站,并加上密码
root /opt/htdocs/www;
allow 208.97.167.194;
allow 222.33.1.2;
allow 231.152.49.4;
deny all;
auth_basic “C1G_ADMIN”;
auth_basic_user_file htpasswd;
12将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html
rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;
13.文件和目录不存在的时候重定向:
if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}
14.将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
上面例子有个问题是访问/shanghai时将不会匹配
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。
那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/permanent;
}
知道原因后就好办了,让我手动跳转吧
rewrite ^/([0-9a-z]+)job$ /$1job/permanent;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
15.域名跳转
server
{
listen 80;
server_name jump.linuxidc.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rewrite ^/ http://www.linuxidc.com/;
access_log off;
}
16.多域名转向
server_name www.linuxidc.comwww.linuxidc.net;
index index.html index.htm index.php;
root /opt/lampp/htdocs;
if ($host ~ "linuxidc\.net") {
rewrite ^(.*) http://www.linuxidc.com$1permanent;
}
六.nginx全局变量
arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。
args #这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah;
binary_remote_addr #二进制的客户地址。
body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
content_length #请求头中的Content-length字段。
content_type #请求头中的Content-Type字段。
cookie_COOKIE #cookie COOKIE变量的值
document_root #当前请求在root指令中指定的值。
document_uri #与uri相同。
host #请求主机头字段,否则为服务器名称。
hostname #Set to themachine’s hostname as returned by gethostname
http_HEADER
is_args #如果有args参数,这个变量等于”?”,否则等于”",空值。
http_user_agent #客户端agent信息
http_cookie #客户端cookie信息
limit_rate #这个变量可以限制连接速率。
query_string #与args相同。
request_body_file #客户端请求主体信息的临时文件名。
request_method #客户端请求的动作,通常为GET或POST。
remote_addr #客户端的IP地址。
remote_port #客户端的端口。
remote_user #已经经过Auth Basic Module验证的用户名。
request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。
request_method #GET或POST
request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
scheme #HTTP方法(如http,https)。
server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
server_name #服务器名称。
server_port #请求到达服务器的端口号。
七.Apache和Nginx规则的对应关系
Apache的RewriteCond对应Nginx的if
Apache的RewriteRule对应Nginx的rewrite
Apache的[R]对应Nginx的redirect
Apache的[P]对应Nginx的last
Apache的[R,L]对应Nginx的redirect
Apache的[P,L]对应Nginx的last
Apache的[PT,L]对应Nginx的last
例如:允许指定的域名访问本站,其他的域名一律转向www.linuxidc.net
Apache:
RewriteCond %{HTTP_HOST} !^(.*?)\.aaa\.com$[NC]
RewriteCond %{HTTP_HOST} !^localhost$
RewriteCond %{HTTP_HOST}!^192\.168\.0\.(.*?)$
RewriteRule ^/(.*)$ http://www.linuxidc.net[R,L]
Nginx:
if( $host ~* ^(.*)\.aaa\.com$ )
{
set $allowHost ‘1’;
}
if( $host ~* ^localhost )
{
set $allowHost ‘1’;
}
if( $host ~* ^192\.168\.1\.(.*?)$ )
{
set $allowHost ‘1’;
}
if( $allowHost !~ ‘1’ )
{
rewrite ^/(.*)$ http://www.linuxidc.netredirect ;
}
linux服务器的优点
很多人都认为Linux服务器具有最好的生态系统,服务器端的各种软件都为它而设计。Linux系统之所以会成为目前最受关注的系统之一,主要原因是它的免费,以及系统的开放性,可以随时取得程序的原代码,这对于程序开发人员是很重要的。除了这些它还具有以下的优势:Linux服务器优势1:良好的稳定性 Linux内核的源...
linux常用的有几个版本
它使用最新版本的内核,拥有许多用户需要在Linux服务器环境中使用的软件——数据库和Web服务器。 Mandrak没有重大的软件缺陷,只是它更加关注桌面市场,较少关注服务器市场。 因为本文是一篇讨论服务器系统版本的文章,所以这也算是一个缺陷吧。 Red Hat Linux 可能这是最著名的Linux版本了,Red Hat Linux已经创造了自己...
Linux是什么系统为什么服务器都用这个系统
之所以会选择Linux作为服务器系统,是因为它具有独特优势:1)开放性 Linux的创始人将它共享出来免费供大家使用,也就是我们所说的开源,这个特性让所有使用LInux系统的人可以自行定制所需要的内核模块,因为所有人都可以看到使用系统的源代码,因此不用担心恶意功能或者后门,安全性大大加强,相比于Windows,它...
Linux服务器 一般都用啥操作系统
1.Linux服务器通常都会安装些啥应用在上面?解答:非常多,最常见的比如: Web服务(Nginx,Apache,PHP,tomcat)、数据库服务(MySQL,Redis),存储服务(NFS,FASTDFS),比如百度等网站就是需要上述应用。2.Linux好像有很多版本啥小红帽,Ubuntu。分不清楚这些是干啥的。解答:1.5 如何选择服务端Linux...
linux改了用户密码 服务器命令无效
如果您在Linux服务器上更改了用户密码,但发现某些命令或应用程序似乎无效,可能是因为以下几个原因:1. **缓存问题**:某些程序或应用程序可能缓存了旧的用户密码。当您更改密码后,这些缓存的密码可能会导致问题。您可以尝试重启这些服务或应用程序,或者查看相关文档以了解如何清除缓存。2. **SSH会话**...
服务器 linux 用什么系统好
1、Debian Debian运行起来极其稳定,这使得它非常适合用于服务器。Debian平时维护三套正式的软件库和一套非免费软件库,这给另外几款发行版带来了灵感。Debian这款操作系统派生出了多个Linux发行版。它有37500多个软件包,这方面唯一胜过Debian的其他发行版只有Gentoo。Debian使用apt或aptitude来安装和更新软件。
linux停止服务器命令linux停止服务器
从命令行关闭Linux计算机的这五种方法特别有用,因为它们可以在计算机本身上使用,也可以通过远程SSH使用。由于这些命令非常简洁,因此可以快速使用-这可能会导致意外重启!幸运的是,molly-guard实用程序足以避免这种情况。linux服务器开机密码忘了怎么关机?1.重新启动linux系统,在启动的过程中,按住enter键。...
服务器linux速度太慢怎么解决
1、我们平时登陆Linux服务器的时候,都需要在输入用户名之后再等待一下,这个时间因不同而等的时间不一样。2、其实这个问题是由ssh里边的配置造成的,只需要我们改一下即可正常快速登陆。3、我们编辑sshd_config 这个文件:vi \/etc\/ssh\/sshd_config。4、然后在里边打开 需要修改的行。5、我们把前面的...
为什么要用Linux做服务器
大致三个原因:1、免费--Linux是免费的,任何人都可获取而无需付费 2、安全--至今为止,尚未发现linux操作系统上的病毒 3、强大--扩展性强, 用户可以自己定义或改变内核,加入自已的应用程序包,使之更符合特定应用的要求,如web\/erp\/vod等应用服务器, 以下几个方便是windows或unix(如hp-ux,...
服务器用win还是linux好
一:稳定性对比 Linux稳定性更好,Linux更新无需重启,不会停止Server,这才是真正的Server;Linux服务器相对Windows服务器,宕机机率更低;Linux系统处理多进程比Windows要好的多;Linux系统相对win来说“灵敏”;二:安全性对比 Linux是建立在Unix上,从一开始就是为多用户设计的操作系统;Linux文件管理一...
代曹乳疾: nginx的启动命令是:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf-c制定配置文件的路径,不加-nginx会自动加载默认路径的配置文件.以上是通用的启动命令
吴川市15625458421: nginx 怎样在Linux环境下安装 - ?
代曹乳疾: 推荐源码安装 下载 nginx-0.8.46.tar.gz 解压 configure (选项) make make install 网上搜个教程照着做,遇到具体点的问题再来问吧
吴川市15625458421: linux下怎么启动nginx - ?
代曹乳疾: 假如你nginx安装在/usr/local/下,启动nginx是/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
吴川市15625458421: linux下nginx怎么配置站点 - ?
代曹乳疾: Linux环境下,怎么确定Nginx是以那个config文件启动的?输入命令行: ps -ef | grep nginx 摁回车,将出现如下图片:master process 后面的就是 nginx的目录.
吴川市15625458421: 如何在远程Linux服务器上搭建Nginx - ?
代曹乳疾: 1.将nginx的压缩包nginx-1.8.0.tar.gz上传到Linux服务器2.由于nginx是C语言开发的并且我们这里是通过编译nginx的源码来安装nginx,所以Linux上要安装C语言的编译环境gcc, 如果已经安装此步可以省略,否则执行命令:yum install gcc-c++ ...
吴川市15625458421: linux服务器怎么配置nginx+php+mysql环境 - ?
代曹乳疾: 一、简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 ...
吴川市15625458421: nginx部署在linux下有什么用 - ?
代曹乳疾: 设置你监听的端口,设置server_name为ip+端口 server { listen 9000; charset utf-8; server_name xx.xx.xx.xx:9000; ...... } 重启,然后就可以使用该IP访问了
吴川市15625458421: linux服务器怎么安装nginx - ?
代曹乳疾: step1. 在 /home 下创建 nginx 文件夹 将 nginx-1.7.8.tar.gz 上传到 nginx 文件夹下 step2. 解压 tar -xzvf nginx-1.7.8.tar.gz step3. 进入 nginx-1.7.8 中 step4. 执行 ./configure --prefix=/usr/local/nginx-1.7.8 --with-http_ssl_module --with-http_spdy_...
吴川市15625458421: 怎样在linux下安装nginx,pcre,zlib,openssl - ?
代曹乳疾: pcre,zlib,openssl这三个可以通过如下指令全部安装:yum install -y pcre zlib opensslnginx的安装可以如下操作:1.先从nginx官网下载最新的版本 http://nginx.org/d...
吴川市15625458421: linux 下nginx模块的安装 - ?
代曹乳疾: 安装 第一步 下载并解压Nginx压缩包 从Nginx官网下载Nginx,或者在Linux上执行wget http://nginx.org/download/nginx-1.10.1.tar.gz命令直接下载 解压nginx-1.10.1.tar.gz文件:tar zxvf nginx-1.10.1.tar.gz11 第二步 配置 cd nginx-1.10.1./configure ...