基礎知識之nginx重寫規則

nginx重寫規則php

nginx rewrite 正則表達式匹配css

大小寫匹配html

~ 爲區分大小寫匹配前端

~* 爲不區分大小寫匹配nginx

!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配web

文件及目錄匹配正則表達式

-f和!-f用來判斷是否存在文件sql

-d和!-d用來判斷是否存在目錄express

-e和!-e用來判斷是否存在文件或目錄apache

-x和!-x用來判斷文件是否可執行

flag標記

last 至關於Apache裏的[L]標記,表示完成rewrite

break 終止匹配, 再也不匹配後面的規則。

redirect 返回302臨時重定向 地址欄會顯示跳轉後的地址。

permanent 返回301永久重定向 地址欄會顯示跳轉後的地址。

logcation的幾個使用實例:

1)location / { }:匹配任何查詢,由於全部請求都以 / 開頭。可是正則表達式規則將被優先和查詢匹配。
2)location =/ {}:僅僅匹配/
3)location ~* \.(gif|jpg|jpeg)$


rewrite \.(gif|jpg)$ /logo.png;
}:location不區分大小寫,匹配任何以gif,jpg,jpeg結尾的文件。

幾個實例:

多目錄轉成參數

要求: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;

}

目錄對換

要求:/123456/xxxx -> /xxxx?id=123456

規則配置:

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

再來一個針對瀏覽器優化的自動rewrite,這裏rewrite後的目錄能夠是存在的;

例如設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄

規則以下:

if ($http_user_agent ~ MSIE) {

rewrite ^(.*)$ /nginx-ie/$1 break;

}

目錄自動加「/」 ,這個功能通常瀏覽器自動完成

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

如下這些可能就跟廣義的rewrite重寫無關了

禁止htaccess

location ~/\.ht {

deny all;

}

禁止多個目錄

location ~ ^/(cron|templates)/ {

deny all; break;

}

禁止以/data開頭的文件,能夠禁止/data/下多級目錄下.log.txt等請求

location ~ ^/data {

deny all;

}

禁止單個文件

location ~ /data/sql/data.sql {

deny all;

}

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

}

設定某個文件的瀏覽器緩存過時時間;這裏爲600秒,並不記錄訪問日誌

location ^~ /html/scripts/loadhead_1.js {

access_log off;

expires 600;

break;

}

Nginx還能夠自定義某一類型的文件的保質期時間,具體寫法看下文的代碼:

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}

//上段代碼就將js|css|jpg|jpeg|gif|png|swf這類文件的保質期設置爲一小時。

防盜鏈的設置:

防盜鏈:若是你的網站是個下載網站,下載步驟應該是先通過你的主頁找到下載地址,才能下載,爲了防止某些網友直接訪問下載地址徹底不經過主頁下載,咱們就可使用防盜鏈的方式,具體代碼以下:

location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}

文件反盜鏈並設置過時時間--<盜鏈屢次請求也會打開你的站點的圖片啊,因此設置下緩存時間,不會每次盜鏈都請求並下載這張圖片>

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

valid_referers none blocked *.jjonline.cn *.jjonline.com.cn *.lanwei.org *.jjonline.org localhost 42.121.107.189;

if ($invalid_referer) {

rewrite ^/ http://img.jjonline.cn/forbid.gif;

return 417;

break;

}

access_log off;

break;

}

說明:

這裏的return 417 爲自定義的http狀態碼,默認爲403,方便經過nginx的log文件找出正確的盜鏈的請求地址

「rewrite ^/ http://img.jjonline.cn/forbid.gif;」顯示一張防盜鏈圖片

「access_log off;」不記錄訪問日誌,減輕壓力

「expires 3d」全部文件3天的瀏覽器緩存

只充許固定ip訪問網站,並加上密碼;這個對有權限認證的應用比較在行

location \ {

allow 22.27.164.25; #容許的ipd

deny all;

auth_basic 「KEY」; #認證的一些設置

auth_basic_user_file htpasswd;

}

說明:location的應用也有各類變化,這裏的寫法就針對了根目錄了。

文件和目錄不存在的時重定向

if (!-e $request_filename) {

#proxy_pass http://127.0.0.1; #這裏是跳轉到代理ip,這個代理ip上有一個監聽的web服務器

rewrite ^/ http://www.jjonline.cn/none.html; #跳轉到這個網頁去

#return 404; #直接返回404碼,而後會尋找root指定的404.html文件

}

域名跳轉

server {

listen 80;

server_name jump.jjonline.cn ;#須要跳轉的多級域名

index index.html index.htm index.php; #入口索引文件的名字

root /var/www/public_html/; #這個站點的根目錄

rewrite ^/ http://www.jjonline.cn/;

#rewrite到這個地址,功能表現:在瀏覽器上輸入jump.jjonline.cn並回車,不會有任何提示直接變成www.jjonline.cn

access_log off;

}

多域名轉向

server {

listen 80;

server_name www.jjonline.cn www.jjonline.org;

index index.html index.htm index.php;

root /var/www/public_html/;

if ($host ~ 「jjonline\.org」) {

rewrite ^(.*) http://www.jjonline.cn$1 permanent;

}

}

三級域名跳轉

if ($http_host ~* 「^(.*)\.i\.jjonline\.cn$」) {

rewrite ^(.*) http://demo.jjonline.cn$1;

break;

}

域名鏡向

server {

listen 80;

server_name mirror.jjonline.cn;

index index.html index.htm index.php;

root /var/www/public_html;

rewrite ^/(.*) http://www.jjonline.cn/$1 last;

access_log off;

}

某個子目錄做鏡向,這裏的示例是demo子目錄

location ^~ /demo {

rewrite ^.+ http://demo.jjonline.cn/ last;

break;

}

如下在附帶本博客的rewrite寫法,emlog系統的rewrite

location ~ {

if (!-e $request_filename) {

rewrite ^/(.+)$ /index.php last;

}

}

今天搞https接入的時候,nginx這邊進行https的認證加解密功能,因此後端的nginx和apache都是不須要進行什麼變化的,業務 也是如此,可是有一個業務稍微有點不一樣,其須要根據http接入和https接入的不一樣來作吐出不一樣的東東,因爲nginx這一層接入來作的ssl相關的 東東,到了後端的apache這裏已是http的了(這樣作的目的是爲了省事和性能考慮)。這是cgi並不知道轉發過來的是http的請求仍是 https的請求。

因而就須要在前端接入nginx這裏作一些調整,使獲得後端的時候可以判斷是不是https的。

想到的一個簡單的方法就是經過rewrite規則,將請求的參數後面增長一個特殊的參數用於表示這是https的請求。

因而配置轉發的規則,在location裏面配置了怎麼也不行,因而只能在server裏面經過if判斷來進行配置了。

if ( $request_uri ~* ^\/***\/ ) {
rewrite ^(.+)$ $1?***https=1 last;
}

問題獲得瞭解決,到後端apache的請求都會帶上一個特殊的***https的請求參數啦,從而方便了後端的程序來進行判斷。

呵呵,固然也能夠經過配置其它的虛擬主機的方式來實現,不過這樣的話,就要拷貝一份程序的代碼,爲https寫一份差很少相同的代碼,實在麻煩。

在使用nginx的rewrite的時候,開始加上了$query_string 發現到了後端的參數是double了的,查閱了一下發現:
rewrite

語法: rewrite regex replacement flag

默認: 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.

這個指令根據表達式來更改URI,或者修改字符串。指令根據配置文件中的順序來執行。

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:

注意重寫表達式只對相對路徑有效。若是你想配對主機名,你應該使用if語句。

呵呵,rewrite只是會改寫路徑部分的東東,不會改動用戶的輸入參數,所以這裏的if規則裏面,你無需關心用戶在瀏覽器裏輸入的參數,rewrite後會自動添加的 ,所以,咱們只是加上了一個?號和後面咱們想要的一個小小的參數***https=1就能夠了。

nginx的rewrite規則參考:

~ 爲區分大小寫匹配
~* 爲不區分大小寫匹配
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹

-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行

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

結合QeePHP的例子

if (!-d $request_filename) {
rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&amp;controller=$1&amp;action=$2&amp;$3 last;
rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&amp;controller=$1 last;
break;

多目錄轉成參數
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;
}

目錄對換
/123456/xxxx -> /xxxx?id=123456

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

例以下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:

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

目錄自動加「/」

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

禁止htaccess

location ~/\.ht {
deny all;
}

禁止多個目錄

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

禁止以/data開頭的文件
能夠禁止/data/下多級目錄下.log.txt等請求;

location ~ ^/data {
deny all;
}

禁止單個目錄
不能禁止.log.txt能請求

location /searchword/cron/ {
deny all;
}

禁止單個文件

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

給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;
}

設定某個文件的過時時間;這裏爲600秒,並不記錄訪問日誌

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

文件反盜鏈並設置過時時間
這裏的return 412 爲自定義的http狀態碼,默認爲403,方便找出正確的盜鏈的請求
「rewrite ^/ http://leech.c1gstudio.com/leech.gif;」顯示一張防盜鏈圖片
「access_log off;」不記錄訪問日誌,減輕壓力
「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.c1gstudio.com/leech.gif;
return 412;
break;
}
access_log off;
root /opt/lampp/htdocs/web;
expires 3d;
break;
}

只充許固定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;

將多級目錄下的文件轉成一個文件,加強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;

將根目錄下某個文件夾指向2級目錄
如/shanghai job/ 指向 /area/shanghai /
若是你將last改爲permanent,那麼瀏覽器地址欄顯是/location/shanghai/

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

上面例子有個問題是訪問/shanghai 時將不會匹配

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

這樣/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/$2 last;

文件和目錄不存在的時候重定向:

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

域名跳轉

server
{
listen 80;
server_name jump.c1gstudio.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rewrite ^/ http://www.c1gstudio.com/;
access_log off;
}

多域名轉向

server_name www.c1gstudio.com www.c1gstudio.net;
index index.html index.htm index.php;
root /opt/lampp/htdocs;
if ($host ~ 「c1gstudio\.net」) {
rewrite ^(.*) http://www.c1gstudio.com$1 permanent;
}

三級域名跳轉

if ($http_host ~* 「^(.*)\.i\.c1gstudio\.com$」) {
rewrite ^(.*) http://top.yingjiesheng.com$1;
break;
}

域名鏡向

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

某個子目錄做鏡向

location ^~ /zhaopinhui {
rewrite ^.+ http://zph.c1gstudio.com/ 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\%3D$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某版塊單獨配置域名

server_name bbs.c1gstudio.com news.c1gstudio.com;
location = / {
if ($http_host ~ news\.c1gstudio.com$) {
rewrite ^.+ http://news.c1gstudio.com/forum-831-1.html last;
break;
}
}

discuz ucenter 頭像 rewrite 優化

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

相關文章
相關標籤/搜索