卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

Nginx與Apache的Rewrite規(guī)則實(shí)例對(duì)比

最近在VPS 上嘗試配置安裝一個(gè)網(wǎng)站,VPS 安裝了LNMP(Linux Nginx MySQL php)在配置重定規(guī)則的時(shí)候經(jīng)常遇到一些問(wèn)題,直接用Apache 的規(guī)則到Nginx 下沒(méi)起作用。原來(lái)

最近在VPS 上嘗試配置安裝一個(gè)網(wǎng)站,VPS 安裝了LNMP

(Linux Nginx MySQL php)在配置重定規(guī)則的時(shí)候經(jīng)常遇到一些問(wèn)題,直接用Apache 的規(guī)則到Nginx 下沒(méi)起作用。原來(lái)Apache 重寫(xiě)的規(guī)則到nginx 上還有一些不太一樣的地方。 這里只是簡(jiǎn)單記錄一些學(xué)習(xí)示例,高手略過(guò),新手可以看一下。

Nginx Rewrite規(guī)則相關(guān)指令

Nginx Rewrite規(guī)則相關(guān)指令有if 、rewrite 、set 、return 、break 等,其中rewrite 是最關(guān)鍵的指令。一個(gè)簡(jiǎn)單的Nginx Rewrite規(guī)則語(yǔ)法如下:

rewrite ^/b/(.*).html /play.php?video=$1 break;

如果加上if 語(yǔ)句,示例如下:

if (!-f $request_filename)

rewrite ^/img/(.*)$ /site/$host/images/$1 last;

Nginx 與Apache 的Rewrite 規(guī)則實(shí)例對(duì)比

簡(jiǎn)單的Nginx 和Apache 重寫(xiě)規(guī)則區(qū)別不大,基本上能夠完全兼容。例如:

Apache Rewrite 規(guī)則:

RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

RewriteRule ^/ceshi/$ /zl/ceshi.php [L]

RewriteRule ^/(mianshi)_([a-zA-Z] )/$ /zl/index.php?name=$1_$2 [L] RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]

Nginx Rewrite 規(guī)則:

rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

rewrite ^/ceshi/$ /zl/ceshi.php last;

rewrite ^/(mianshi)_([a-zA-Z] )/$ /zl/index.php?name=$1_$2 last; rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;

由以上示例可以看出,Apache 的Rewrite 規(guī)則改為Nginx 的Rewrite 規(guī)則,其實(shí)很簡(jiǎn)單:Apache 的RewriteRule 指令換成Nginx 的rewrite 指令,Apache 的[L]標(biāo)記換成Nginx 的last 標(biāo)記,中間的內(nèi)容不變。

如果Apache 的Rewrite 規(guī)則改為Nginx 的Rewrite 規(guī)則后,使用nginx -t命令檢查發(fā)現(xiàn)nginx.conf 配置文件有語(yǔ)法錯(cuò)誤,那么可以嘗試給條件加上引號(hào)。例如一下的Nginx Rewrite規(guī)則會(huì)報(bào)語(yǔ)法錯(cuò)誤:

rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;

加上引號(hào)就正確了:

rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;

Apache 與Nginx 的Rewrite 規(guī)則在URL 跳轉(zhuǎn)時(shí)有細(xì)微的區(qū)別:

,

Apache Rewrite 規(guī)則:

RewriteRule ^/html/tagindex/([a-zA-Z] )/.*$ /$1/ [R=301,L]

Nginx Rewrite 規(guī)則:

rewrite ^/html/tagindex/([a-zA-Z] )/.*$ http://$host/$1/ permanent;

以上示例中,我們注意到,Nginx Rewrite 規(guī)則的置換串中增加了“http://$host”,這是在Nginx 中要求的。

另外,Apache 與Nginx 的Rewrite 規(guī)則在變量名稱方面也有區(qū)別,例如:

Apache Rewrite 規(guī)則:

RewriteRule

^/user/login/$ /user/login.php?login=1&forward=http://{HTTP_HOST} [L] Nginx Rewrite 規(guī)則:

rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host last; Apache 與Nginx Rewrite 規(guī)則的一些功能相同或類似的指令、標(biāo)記對(duì)應(yīng)關(guān)系:

Apache 的RewriteCond 指令對(duì)應(yīng)Nginx 的if 指令;

Apache 的RewriteRule 指令對(duì)應(yīng)Nginx 的rewrite 指令;

Apache 的[R]標(biāo)記對(duì)應(yīng)Nginx 的redirect 標(biāo)記;

Apache 的[P]標(biāo)記對(duì)應(yīng)Nginx 的last 標(biāo)記;

Apache 的[R,L]標(biāo)記對(duì)應(yīng)Nginx 的redirect 標(biāo)記;

Apache 的[P,L]標(biāo)記對(duì)應(yīng)Nginx 的last 標(biāo)記;

Apache 的[PT,L]標(biāo)記對(duì)應(yīng)Nginx 的last 標(biāo)記;

允許指定的域名訪問(wèn)本站,其他域名一律跳轉(zhuǎn)到http://www.aaa.com

Apache Rewrite 規(guī)則:

RewriteCond {HTTP_HOST} ^(.*?).domain.com$

RewriteCond {HTTP_HOST} !^qita.domain.com$

RewriteCond {DOCUMENT_ROOT}/market/1/index.htm -f

RewriteRule ^/wu/$ /market/1/index.htm [L]

Nginx 的if 指令不支持嵌套,也不支持AND 、OR 等多條件匹配,相比于Apache 的

RewriteCond ,顯得麻煩一些,但是,我們可以通過(guò)下一頁(yè)的Nginx 配置寫(xiě)法來(lái)實(shí)現(xiàn)這個(gè)示例: Nginx Rewrite 規(guī)則:

if ($host ~* ^(.*?).domain.com$) set $var_wupin_city $1;

set $var_wupin ?1′;

if ($host ~* ^qita.domain.com$)

set $var_wupin ?0′;

if (!-f $document_root/market/$var_wupin_city/index.htm)

set $var_wupin ?0′;

if ($var_wupin ~ ?1′)

rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;

}

rewrite 的語(yǔ)法

,

語(yǔ)法: rewrite regex replacement flag

默認(rèn): none

作用域: server, location, if

This directive changes URI in accordance with the regular expression and the replacement string. Directives are carried out in order of appearance in the configuration file.

這個(gè)指令根據(jù)表達(dá)式來(lái)更改URI ,或者修改字符串。指令根據(jù)配置文件中的順序來(lái)執(zhí)行。 Be aware that the rewrite regex only matches the relative path instead of the

absolute URL. If you want to match the hostname, you should use an if condition, like so:

注意重寫(xiě)表達(dá)式只對(duì)相對(duì)路徑有效。如果你想配對(duì)主機(jī)名,你應(yīng)該使用if 語(yǔ)句。

rewrite 只是會(huì)改寫(xiě)路徑部分的東東,不會(huì)改動(dòng)用戶的輸入?yún)?shù),因此這里的if 規(guī)則里面,你無(wú)需關(guān)心用戶在瀏覽器里輸入的參數(shù),rewrite 后會(huì)自動(dòng)添加的,因此,我們只是加上了一個(gè)?號(hào)和后面我們想要的一個(gè)小小的參數(shù) ***https=1就可以了。

nginx 的rewrite 規(guī)則參考:

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

? ~ 為區(qū)分大小寫(xiě)匹配 ~* 為不區(qū)分大小寫(xiě)匹配 !~和!~*分別為區(qū)分大小寫(xiě)不匹配及不區(qū)分大小寫(xiě)不匹 -f 和!-f 用來(lái)判斷是否存在文件 -d 和!-d 用來(lái)判斷是否存在目錄 -e 和!-e 用來(lái)判斷是否存在文件或目錄 -x 和!-x 用來(lái)判斷文件是否可執(zhí)行 last 相當(dāng)于Apache 里的[L]標(biāo)記,表示完成rewrite ,呵呵這應(yīng)該是最常用的 break 終止匹配, 不再匹配后面的規(guī)則 redirect 返回302臨時(shí)重定向 地址欄會(huì)顯示跳轉(zhuǎn)后的地址 permanent 返回301永久重定向 地址欄會(huì)顯示跳轉(zhuǎn)后的地址 $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

結(jié)合QeePHP 的例子

?

? if (!-d $request_filename) { rewrite

^/([a-z-A-Z] )/([a-z-A-Z] )/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;

?

? rewrite ^/([a-z-A-Z] )/?$ /index.php?namespace=user&controller=$1 last; break;

多目錄轉(zhuǎn)成參數(shù)

abc.domian.com/sort/2 =>

abc.domian.com/index.php?act=sort&name=abc&id=2

?

?

?

? if ($host ~* (.*).domain.com) { set $sub_name $1; rewrite ^/sort/(d )/?$ /index.php?act=sort&cid=$sub_name&id=$1 last; }

目錄對(duì)換

/123456/xxxx -> /xxxx?id=123456

? rewrite ^/(d )/(. )/ /$2?id=$1 last;

例如下面設(shè)定nginx 在用戶使用ie 的使用重定向到/nginx-ie目錄下:

?

?

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

目錄自動(dòng)加“/”

,

?

?

? if (-d $request_filename){ rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; }

禁止htaccess

?

?

? location ~/.ht { deny all; }

禁止多個(gè)目錄

?

?

?

? location ~ ^/(cron|templates)/ { deny all; break; }

禁止以/data開(kāi)頭的文件

可以禁止/data/下多級(jí)目錄下.log.txt 等請(qǐng)求;

?

?

? location ~ ^/data { deny all; }

禁止單個(gè)目錄

不能禁止.log.txt 能請(qǐng)求

?

?

? location /searchword/cron/ { deny all; }

禁止單個(gè)文件

?

?

? location ~ /data/sql/data.sql { deny all; }

給favicon.ico 和robots.txt 設(shè)置過(guò)期時(shí)間;

這里為favicon.ico 為99天,robots.txt 為7天并不記錄404錯(cuò)誤日志 ?

?

?

?

?

? location ~(favicon.ico) { log_not_found off; expires 99d; break; }

,

?

?

?

?

? location ~(robots.txt) { log_not_found off; expires 7d; break; }

設(shè)定某個(gè)文件的過(guò)期時(shí)間; 這里為600秒,并不記錄訪問(wèn)日志

?

?

?

?

?

? location ^~ /html/scripts/loadhead_1.js { access_log off; root /opt/lampp/htdocs/web; expires 600; break; }

文件反盜鏈并設(shè)置過(guò)期時(shí)間

這里的return 412 為自定義的http 狀態(tài)碼,默認(rèn)為403,方便找出正確的盜鏈的請(qǐng)求 “rewrite ^/ http://leech.divmy.com/leech.gif;”顯示一張防盜鏈圖片

“access_log off;”不記錄訪問(wèn)日志,減輕壓力

“expires 3d”所有文件3天的瀏覽器緩存

?

?

?

?

?

?

?

?

?

?

?

? location ~* ^. .(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194; if ($invalid_referer) { rewrite ^/ http://leech.divmy.com/leech.gif; return 412; break; } access_log off; root /opt/lampp/htdocs/web; expires 3d; break; }

只充許固定ip 訪問(wèn)網(wǎng)站,并加上密碼

?

?

?

?

?

?

? 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;

,

將多級(jí)目錄下的文件轉(zhuǎn)成一個(gè)文件,增強(qiáng)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; 將根目錄下某個(gè)文件夾指向2級(jí)目錄

如/shanghai job/ 指向 /area/shanghai /

如果你將last 改成permanent ,那么瀏覽器地址欄顯是/location/shanghai/

? rewrite ^/([0-9a-z] )job/(.*)$ /area/$1/$2 last;

上面例子有個(gè)問(wèn)題是訪問(wèn)/shanghai 時(shí)將不會(huì)匹配

?

? rewrite ^/([0-9a-z] )job$ /area/$1/ last; rewrite ^/([0-9a-z] )job/(.*)$ /area/$1/$2 last;

這樣/shanghai 也可以訪問(wèn)了,但頁(yè)面中的相對(duì)鏈接無(wú)法使用,

如./list_1.html真實(shí)地址是/area/shanghia/list_1.html會(huì)變成/list_1.html,導(dǎo)至無(wú)法訪問(wèn)。

那我加上自動(dòng)跳轉(zhuǎn)也是不行咯

(-d $request_filename)它有個(gè)條件是必需為真實(shí)目錄,而我的rewrite 不是的,所以沒(méi)有效果

?

?

? if (-d $request_filename){ rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; }

知道原因后就好辦了,讓我手動(dòng)跳轉(zhuǎn)吧

?

? rewrite ^/([0-9a-z] )job$ /$1job/ permanent; rewrite ^/([0-9a-z] )job/(.*)$ /area/$1/$2 last;

文件和目錄不存在的時(shí)候重定向:

?

?

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

域名跳轉(zhuǎn)

?

?

?

? server { listen 80; server_name jump.88dgw.com;

,

?

?

?

?

? index index.html index.htm index.php; root /opt/lampp/htdocs/www; rewrite ^/ ; access_log off; }

多域名轉(zhuǎn)向

?

?

?

?

?

? server_name ; index index.html index.htm index.php; root /opt/lampp/htdocs; if ($host ~ “c1gstudio.net”) { rewrite ^(.*) permanent; }

三級(jí)域名跳轉(zhuǎn)

?

?

?

? if ($http_host ~* “^(.*).i.c1gstudio.com$”) { rewrite ^(.*) ; break; }

域名鏡向

?

?

?

?

?

?

?

?

? server { listen 80; server_name mirror.c1gstudio.com; index index.html index.htm index.php; root /opt/lampp/htdocs/www; rewrite ^/(.*) last; access_log off; }

某個(gè)子目錄作鏡向

?

?

?

? location ^~ /zhaopinhui { rewrite ^. last; break; }

discuz ucenter home (uchome) rewrite ?

? rewrite ^/(space|network)-(. ).html$ /$1.php?rewrite=$2 last; rewrite ^/(space|network).html$ /$1.php last;

,

? rewrite ^/([0-9] )$ /space.php?uid=$1 last;

discuz 7 rewrite

?

? rewrite ^(.*)/archiver/((fid|tid)-[w-] .html)$ $1/archiver/index.php?$2 last; rewrite

^(.*)/forum-([0-9] )-([0-9] ).html$ $1/forumdisplay.php?fid=$2&page=$3 last;

? rewrite

^(.*)/thread-([0-9] )-([0-9] )-([0-9] ).html$ $1/viewthread.php?tid=$2&extra=page=$4&page=$3 last;

?

?

? rewrite ^(.*)/profile-(username|uid)-(. ).html$ $1/viewpro.php?$2=$3 last; rewrite ^(.*)/space-(username|uid)-(. ).html$ $1/space.php?$2=$3 last; rewrite ^(.*)/tag-(. ).html$ $1/tag.php?name=$2 last;

給discuz 某版塊單獨(dú)配置域名

?

?

?

?

?

?

?

? server_name bbs.c1gstudio.com news.c1gstudio.com; location = / { if ($http_host ~ news.divmy.com$) { rewrite ^. last; break; } }

discuz ucenter 頭像 rewrite 優(yōu)化

?

?

?

?

?

?

?

?

?

?

?

?

?

?

? location ^~ /ucenter { location ~ .*.php?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location /ucenter/data/avatar { log_not_found off; access_log off; location ~ /(.*)_big.jpg$ { error_page 404 /ucenter/images/noavatar_big.gif; }

,

?

?

?

?

?

?

?

?

?

? location ~ /(.*)_middle.jpg$ { error_page 404 /ucenter/images/noavatar_middle.gif; } location ~ /(.*)_small.jpg$ { error_page 404 /ucenter/images/noavatar_small.gif; } expires 300; break; } }

jspace rewrite

?

?

?

?

?

?

?

?

?

?

?

?

?

?

? location ~ .*.php?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~* ^/index.php/ { rewrite ^/index.php/(.*) /index.php?$1 break; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; }

另外這里還有一個(gè)工具可以直接把a(bǔ)pache 規(guī)則轉(zhuǎn)化為nginx 規(guī)則 參考:

標(biāo)簽: