Bir. Düzenli ifade eşleşmesi, burada: * ~ büyük harf duyarlı eşleştirmedir * ~* küçük harf duyarsız bir eşleşmedir * !~ ve !~* sırasıyla küçük harf duyarlı ve küçük harf duyarsızlığı olmayan uyumsuzluklardır İki. dosya ve dizin eşleşir, burada: * -f ve !-f dosyanın var olup olmadığını belirlemek için kullanılır * -d ve !-d bir dizinin var olup olmadığını belirlemek için kullanılır * -e ve !-e bir dosya veya dizinin var olup olmadığını belirlemek için kullanılır * -x ve !-x dosyanın çalıştırılabilir olup olmadığını belirlemek için kullanılır 3. Yeniden yazma komutunun son parametresi bayrak işaretidir ve bu işaret şu şekilde işaretlenmiştir: 1.sonuncu, apache'deki [L] işaretiyle eşdeğerdir, yani yeniden yazma anlamına gelir. 2. Ara Bu kuralın eşleşmesi tamamlandıktan sonra, eşleşme sona erer ve sonraki kurallar artık eşleştirilmez. 3.redirect 302 geçici yönlendirmeyi döndürür ve tarayıcı adresi sıçrayıştan sonra URL adresini gösterir. 4.kalıcı return 301 kalıcı yönlendirme, tarayıcı adresi sıçrayıştan sonra URL adresini gösterir.
URI yeniden yazmalarını uygulamak için son ve ara tuşlarını kullanın ve tarayıcı adres çubuğu değişmeden kalır. Ve ikisi arasında küçük bir fark var, takma ad komutu kullanmak en son ile işaretlenmelidir; proxy_pass direktiflerini kullanırken, break etiketi kullanmanız gerekir. Bu yeniden yazma kuralında son etiket çalıştırıldıktan sonra, sunucuda olacak{......} etiket isteği yeniden başlatırken, kural eşleşmesi tamamlandıktan sonra break etiketi maçı sonlandırır. Örneğin: /photo/123456 gibi bir URL'yi /path/to/photo/12/1234/123456.png "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png ;
Dört. NginxRewrite kuralı
1.Break komutu Kullanım ortamı: sunucu, konum, if; Direktif mevcut kural setini tamamlar ve artık yeniden yazma direktifini işlemez.
2. Eğer direktif Kullanım ortamı: sunucu, konum Bu talimat, bir koşulun sağlanıp sağlanmadığını kontrol etmek için kullanılır ve eğer sağlanırsa, cümleyi kıvırtılı desteklerin içinde çalıştırır. If komutu iç içe yapmayı desteklemez ve birden fazla koşulu && ve || desteklemez Tedavi.
3. Geri Komut sözdizimi: returncode ; Kullanım ortamı: sunucu, konum, if; Bu talimat, kuralın yürütülmesini sonlandırmak ve istemciye bir durum kodu döndürmek için kullanılır. Örneğin: Ziyaret edilen URL ".sh" veya ".bash" ile biterse, 403 durum kodu döner. konum ~ .*\. (sh|bash)?$
{ dönüş 403;
}
4. komutu yeniden yaz Sözdizimi: rewriteregex yerine bastırma Kullanım ortamı: sunucu, konum, eğer Bu direktra, ifadeye göre URI'yi yönlendirir veya diziyi değiştirir. Komutlar, yapılandırma dosyasındaki sırayla yürütülür. İfadeleri yeniden yazmanın yalnızca göreli yollar için geçerli olduğunu unutmayın. Host adlarını eşleştirmek istiyorsanız, if ifadelerini kullanmalısınız, örneğin aşağıda: if( $host ~* www\.(. *) )
{ set: $host_without_www $1; ^(.*)$ http://$host_without_www$1permanent;
}
5. Komutu ayar Sözdizimi: setvariable değeri; Varsayılan: yok; Kullanım ortamı: sunucu, konum, if; Bu direktif bir değişkeni tanımlamak ve ona bir değer atamak için kullanılır. Bir değişkenin değeri metin, değişken veya metin değişkenlerinin birleşimi olabilir. Örnek: set$varname "merhaba dünya";
6.Uninitialized_variable_warn talimatlar Sözdizimi: uninitialized_variable_warnon|off Kullanım ortamı: http, sunucu, konum, eğer Bu komut, başlatılmamış değişkenler için uyarı mesajını açıp kapatmak için kullanılır ve varsayılan değer Açıktır.
Beş. Nginx Kural Yazımı Yeniden Yazma örneği 1. Erişilen dosya ve dizin mevcut olmadığında, belirli bir php dosyasına yönlendirin if( !-e $request_filename )
{ en son olarak ^/(.*)$ index.php yeniden yaz;
}
2. Dizin değişimi /123456/xxxx ====> /xxxx?id=123456 yeniden yaz ^/(\d+)/(.+)/ /$2?id=$1 son;
3. İstemci IE tarayıcısı kullanıyorsa, /ie dizinine yönlendirilir if( $http_user_agent ~ MSIE)
{ ^(.*)$ /ie/$1 kırgı;
}
4. Birden fazla dizine erişimi devre dışı bırakın konum ~ ^/(cron|şablonlar)/
{ her şeyi inkâr et; mola;
}
5. /data ile başlayan dosyalara erişimi devre dışı bırakın konum ~ ^/veri
{ her şeyi inkâr et;
}
6. Dosya eki isimleri .sh, .flv, .mp3 dosya eklerine erişimi yasakla konum ~ .*\. (sh|flv|mp3)$
{ dönüş 403;
}
7. Belirli dosya türleri için tarayıcı önbellek süresini ayarlayın konum ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$
{ 30d süresi doludur;
} konum ~ .*\. (js|css)$
{ 1 saat süresi doluyor;
}
8. favicon.ico ve robots.txt için son kullanma sürelerini belirleyin; Burada favicon.ico 99 gün, robots.txt 7 gün ve 404 hata logu kayıt yapılmıyor konum ~(favicon.ico) { log_not_found çekildi; 99d süresi doludur; mola;
} konum ~(robots.txt) { log_not_found çekildi; 7d süresi doluyor; mola;
}
9. Belirli bir belgenin son kullanma tarihini belirleyin; Bu 600 saniyedir ve erişim kayıtları kaydedilmiyor konum ^~ /html/scripts/loadhead_1.js { access_log çekildi; kök /opt/lampp/htdocs/web; 600 süresi doludur; mola;
}
10. Anti-hotlink dosyaları ve ayarlanmış son kullanma süreleri Return412 burada özel bir HTTP durum kodu varsayılan, varsayılan olarak 403 olarak belirleniyor ve doğru hotlink isteği bulmak için kullanışlıdır "yeniden yaz ^/ ; "Anti-hotlink görüntüsü gösteriyor "access_log defol;" Erişim kayıtları kaydedilmez, bu da stresi azaltır "3D süresi doldu" Tüm dosyalar için 3 günlük tarayıcı önbelleği
konum ~*^.+\. (jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers None engellendi *.xx.com*.xx.net localhost 208.97.167.194; if ($invalid_referer) { yeniden yaz ^/ ; dönüş 412; mola;
} access_log çekildi; kök /opt/lampp/htdocs/web; 3D süresi doluyor; mola;
}
11. Web sitesine yalnızca şifreyle sabit IP erişimine izin verin
kök /opt/htdocs/www; 208.97.167.194 izni ver; 222.33.1.2 ile izin ver; 231.152.49.4 yüzüne izin verin; her şeyi inkâr et; auth_basic "C1G_ADMIN"; auth_basic_user_file htpasswd;
12Çok katmanlı dizinlerdeki dosyaları tek bir dosyaya dönüştürerek SEO etkilerini artırın
/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. Dosyalar ve dizinler olmadığında yönlendirme:
if (!-e $request_filename) { proxy_pass http://127.0.0.1;
}
14. Kök dizinindeki bir klasörü seviye 2 dizine yönlendirin Örneğin, /shanghaijob/ /area/shanghai/ işaret eder. Sonuncu olarak kalıcı yaparsanız, tarayıcı adres çubuğu /location/shanghai/ olur yeniden yaz ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last; Yukarıdaki örnekteki sorun, /shanghai adresine erişirken eşleşmemesi yeniden yaz ^/([0-9a-z]+)job$ /area/$1/ son; yeniden yaz ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last; Bu yol/şanghay da erişilebilir, ancak sayfadaki ilgili bağlantılar mevcut değildir, Eğer ./list_1.html gerçek adres /area/shanghia/list_1.html /list_1.html olur ve erişilmez hale gelir. O zaman otomatik zıplamayı ekleyemem (-d $request_filename) gerçek bir dizin olması şartı vardır ve benim yeniden yazmam gerçek değildir, bu yüzden etkisi yoktur if (-d $request_filename){ yeniden yaz ^/(.*)([^/])$ http://$host/$1$2/permanent;
} Nedenini öğrendikten sonra yapmak kolay, manuel olarak atlayacağım yeniden yaz ^/([0-9a-z]+)job$ /$1job/permanent; yeniden yaz ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
15. Alan adı atlama sunucu
{ 80 dinle; server_name jump.linuxidc.com; indeks index.html index.htm index.php; root /opt/lampp/htdocs/www; yeniden yaz ^/ http://www.xx.com/; access_log çekildi;
}
16. Çok alanlı turnaj server_name www.xx.comwww.xx.com; indeks index.html index.htm index.php; kök /opt/lampp/htdocs; if ($host ~ "linuxidc\.net") { yeniden yazma ^(.*) http://www.xx.com$1permanent;
}
6. nginx küresel değişkenler arg_PARAMETER #这个变量包含GET请求中, değişken bir PARAMETRE varsa. args #这个变量等于请求行中 (GET isteği) parametreleri, örneğin, foo=123&bar=blahblah; binary_remote_addr #二进制的客户地址. body_bytes_sent #响应时送出的body字节数数量. Bu veriler, bağlantı kesintiye uğrasa bile doğrudur. content_length #请求头中的Content uzunluğunda alan. content_type #请求头中的Content tipi alan. cookie_COOKIE #cookie COOKIE değişkeninin değeri document_root #当前请求在root指令中指定的值. document_uri #与uri相同. sunucu #请求主机头字段, aksi takdirde sunucu adı. hostname, gethostname tarafından döndürülen makinenin host adıyla #Set http_HEADER is_args #如果有args参数, bu değişken "?"'ye eşittir, aksi takdirde """, yani null değer'e eşittir. http_user_agent #客户端agent信息 http_cookie #客户端cookie信息 limit_rate #这个变量可以限制连接速率. query_string #与args相同. request_body_file #客户端请求主体信息的临时文件名. request_method #客户端请求的动作, genellikle GET ya da POST. remote_addr #客户端的IP地址. remote_port #客户端的端口. remote_user #已经经过Auth Kullanıcı adı Temel Modül tarafından doğrulanmıştır. request_completion #如果请求结束, OK olarak ayarlayın. İstek tamamlanmadığında veya istek istek zincirinde son değilse boşal. request_method #GET或POST request_filename #当前请求的文件路径, kök veya takma adlar ve URI istekleriyle oluşturulur. request_uri #包含请求参数的原始URI, ana bilgisayar adını içermez, örneğin, "/foo/bar.php?arg=baz". değiştirilemez. şema #HTTP方法 (örneğin http, https). server_protocol #请求使用的协议, genellikle HTTP/1.0 veya HTTP/1.1. server_addr #服务器地址 bu değer, bir sistem çağrısı tamamlandıktan sonra belirlenebilir. server_name #服务器名称. server_port #请求到达服务器的端口号.
Yedi. Apache ve Nginx kuralları arasındaki yazışmalar Apache'nin RewriteCond'u, Nginx'in Apache'nin RewriteRule'u, Nginx'in yeniden yazmasına karşılık gelir Apache'nin [R] harfi Nginx'in yönlendirmesine karşılık gelir [P] Apache dilinde Nginx'te sona karşılık gelir Apache'nin [R,L] harfi Nginx'in yönlendirmesine karşılık gelir Apache'nin [P,L] notu Nginx'in son notuna karşılık gelir Apache'nin [PT,L] Nginx'in son notuna karşılık gelir
Örneğin, belirli bir alan adının bu siteye erişmesine izin verin ve her zaman diğer www.xx.com alan adlarına yönelin Apachi: RewriteCond %{HTTP_HOST} !^(.*?) \.aaa\.com$[NC] RewriteCond %{HTTP_HOST} !^localhost$ RewriteCond %{HTTP_HOST}!^192\.168\.0\. (.*?) $ RewriteRule ^/(.*)$ http://www.xx.com[R,L]
Nginx: if( $host ~* ^(.*)\.aaa\.com$ )
{ $allowHost '1';
} if( $host ~* ^localhost )
{ $allowHost '1';
} if( $host ~* ^192\.168\.1\.(. *?) $ )
{ $allowHost '1';
} if( $allowHost !~ '1' )
{ yeniden yaz ^/(.*)$ http://www.xx.comredirect ;
}
|