Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 11719|Yanıt: 1

[Web] Bir örnek, Nginx'teki yeniden yazma kuralını göstermektedir

[Bağlantıyı kopyala]
Yayınlandı 5.12.2014 22:45:25 | | |
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 ;
}





Önceki:Sina Weibo, yıl sonu primi almak için 1 sent ödeyecek kodu taradı ve 2015 yuan'a kadar olan yıllık bonusu aldı
Önümüzdeki:CMD5 Windows sistem yöneticisi şifresini kırdı
Yayınlandı 7.12.2014 17:25:05 |
Okumak ve geri göndermek bir erdemdir
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com