Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 11719|Răspunde: 1

[Web] Un exemplu ilustrează regula de rescriere în Nginx

[Copiază linkul]
Postat pe 05.12.2014 22:45:25 | | |
Unu. Potrivire de expresie regulată, unde:
* ~ este potrivirea sensibilă la majuscule
* ~* este o potrivire indiferentă la majuscule
* !~ și !~* sunt nepotriviri sensibile la majuscule și insensibile la majuscule, respectiv
Doi. Se potrivesc fișierele și directorul, unde:
* -f și !-f sunt folosite pentru a determina dacă există un fișier
* -d și !-d sunt folosite pentru a determina dacă există un director
* -e și !-e sunt folosite pentru a determina dacă există un fișier sau un director
* -x și !-x sunt folosite pentru a determina dacă un fișier este executabil sau nu
3. Ultimul parametru al instrucțiunii de rescriere este semnul de steag, care este marcat cu:
1.last este echivalent cu semnul [L] din apache, ceea ce înseamnă rescriere.
2. Pauză După ce potrivirea acestei reguli este finalizată, potrivirea va fi încheiată, iar regulile ulterioare nu vor mai fi potrivite.
3.redirect returnează 302 redirecționare temporară, iar adresa browserului va afișa adresa URL după salt.
4.permanent return 301 permanent redirecționare, adresa browserului va afișa adresa URL după salt.


Folosește last and break pentru a implementa rescrieri URI, iar bara de adrese a browserului rămâne neschimbată. Și există o mică diferență între cele două, folosirea comenzii alias trebuie marcată cu ultimul; Când folosești directivele proxy_pass, trebuie să folosești eticheta de ruptură. După ce ultima etichetă este executată în această regulă de rescriere, va fi pe server{......} Tag-ul reinițiază cererea, în timp ce break-ul încheie meciul după ce meciul de regulă s-a încheiat.
De exemplu: dacă redirecționăm un URL precum /photo/123456 către /path/to/photo/12/1234/123456.png
rescrie "/foto/([0-9]{2})([0-9]{2})([0-9]{2})"/drum/către/foto/$1/$1$2/$1$2$3.png ;


Patru. Regula NginxRewrite


1. comanda de rupere
Mediul de utilizare: server, locație, dacă;
Directiva completează setul curent de reguli și nu mai gestionează directiva de rescriere.


2. Dacă directivele
Mediul de utilizare: server, locație
Această instrucțiune este folosită pentru a verifica dacă o condiție este îndeplinită și, dacă da, pentru a executa afirmația în interiorul abrazadelor curlate. Comanda If nu suportă imbricarea și nu suportă mai multe condiții && și || Tratament.


3. Comanda de returnare
sintaxă: returncode ;
Mediul de utilizare: server, locație, dacă;
Această instrucțiune este folosită pentru a încheia execuția regulii și a returna un cod de stare clientului.
Exemplu: Dacă URL-ul vizitat se termină cu ".sh" sau ".bash", se returnează un cod de stare 403
locație ~ .*\. (sh|bash)?$
{
returnare 403;
}


4. comanda de rescriere
Sintaxă: flag de înlocuire rewriteegex
Mediul de utilizare: server, locație, dacă
Această directivă redirecționează URI-ul în funcție de expresie sau modifică șirul. Instrucțiunile sunt executate în ordinea din fișierul de configurare. Rețineți că rescrierea expresiilor este valabilă doar pentru căile relative. Dacă doriți să împerecheați nume de gazdă, ar trebui să folosiți instrucțiuni if, de exemplu mai jos:
if( $host ~* www\.(. *) )
{
setată $host_without_www 1$;
rescriere ^(.*)$ http://$host_without_www$1permanent;
}


5. Comanda setare
Sintaxă: valoare setvariabilă; Implicit: niciunul; Mediul de utilizare: server, locație, dacă;
Această directivă este folosită pentru a defini o variabilă și a-i atribui o valoare. Valoarea unei variabile poate fi text, variabilă sau uniunea variabilelor de text.
Exemplu: set$varname "hello world";


6.Uninitialized_variable_warn instrucțiuni
Sintaxă: uninitialized_variable_warnon|off
Mediul de utilizare: http, server, locație, dacă
Această comandă este folosită pentru a activa și dezactiva mesajul de avertizare pentru variabilele neinițializate, iar valoarea implicită este On.




Cinci. Exemplu de scriere a regulilor Nginx Rewrite
1. Când fișierul și directorul accesat nu există, redirecționează către un anumit fișier php
if( !-e $request_filename )
{
rescriere ^/(.*)$ index.php ultimul;
}


2. Schimb de directoare /123456/xxxx ====> /xxxx?id=123456
rescrie ^/(\d+)/(.+)/ /$2?id=$1 ultimul;


3. Dacă clientul folosește browserul IE, redirecționează către directorul /ie
if( $http_user_agent ~ MSIE)
{
rescriere ^(.*)$ /ie/$1 pauză;
}


4. Dezactivarea accesului la mai multe directoare
locație ~ ^/(cron|șabloane)/
{
să nege totul;
pauză;
}


5. Dezactivează accesul la fișiere care încep cu /data
Locație ~ ^/date
{
să nege totul;
}


6. Interzicerea accesului la fișiere cu nume de sufixe .sh, .flv, .mp3
locație ~ .*\. (sh|flv|mp3)$
{
returnare 403;
}


7. Setează timpul cache-ului browserului pentru anumite tipuri de fișiere
locație ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$
{
expiră la 30 de zile;
}
locație ~ .*\. (js|css)$
{
expiră 1h;
}


8. Stabilește termenele de expirare pentru favicon.ico și robots.txt;
Aici, favicon.ico este de 99 de zile, iar robots.txt de 7 zile, iar jurnalul de erori 404 nu este înregistrat
locație ~(favicon.ico) {
log_not_found jos;
expiră în 99d;
pauză;
}
locație ~(robots.txt) {
log_not_found jos;
expiră 7d;
pauză;
}


9. Setează timpul de expirare al unui anumit document; Aceasta este 600 de secunde, iar jurnalele de acces nu sunt înregistrate
locație ^~ /html/scripts/loadhead_1.js {
access_log oprit;
root /opt/lampp/htdocs/web;
expiră 600;
pauză;
}


10. Fișiere anti-hotlink și termene de expirare setate
Return412 aici este un cod HTTP personalizat, care implicit este 403, ceea ce este convenabil pentru găsirea cererii corecte de hotlink
"rescriere ^/; "Arată o imagine a unui anti-hotlink
"access_log jos;" Nu se înregistrează jurnale de acces, reducând astfel stresul
"Expiră 3D" 3 zile de cache de browser pentru toate fișierele


locație ~*^.+\. (jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers niciunul nu a blocat *.xx.com*.xx.net localhost 208.97.167.194;
dacă ($invalid_referer) {
rescriere ^/;
returnare 412;
pauză;
}
access_log oprit;
root /opt/lampp/htdocs/web;
expiră 3d;
pauză;
}


11. Permiteți acces IP fix la site doar cu parolă


root /opt/htdocs/www;
permite 208.97.167.194;
permite 222.33.1.2;
permite 231.152.49.4;
să nege totul;
auth_basic "C1G_ADMIN";
auth_basic_user_file htpasswd;


12Convertește fișierele din directoare multi-nivel într-un singur fișier pentru a îmbunătăți efectele SEO
/job-123-456-789.html 指向/job/123/456/789.html


rescriere^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html ultimul;


13. Redirecționează când fișierele și directoarele nu există:


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


14. Indică un folder din directorul rădăcină către directorul de nivel 2
De exemplu, /shanghaijob/ indică /area/shanghai/
Dacă schimbi last în permanent, atunci bara de adrese a browserului va fi /location/shanghai/
rescrie ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
Problema cu exemplul de mai sus este că nu se potrivește când accesezi /shanghai
rescriere ^/([0-9a-z]+)job$ /area/$1/ ultim;
rescrie ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
Acest mod/shanghai este de asemenea accesibil, dar linkurile relative de pe pagină nu sunt disponibile,
Dacă ./list_1.html adresa reală este /area/shanghia/list_1.html va deveni /list_1.html, făcând-o inaccesibilă.
Atunci nu pot adăuga sărituri automate
(-d $request_filename) are o condiție că trebuie să fie un director real, iar rescrierea mea nu este, deci nu are efect
dacă (-d $request_filename){
rescriere ^/(.*)([^/])$ http://$host/$1$2/permanent;
}
Este ușor de făcut după ce știi motivul, lasă-mă să sar manual
rescriere ^/([0-9a-z]+)job$ /$1job/permanent;
rescrie ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;


15. Schimbarea numelor de domeniu
Server
{
ascultă 80;
server_name jump.linuxidc.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rescriere ^/ http://www.xx.com/;
access_log oprit;
}


16. Întoarcere multi-domeniu
server_name www.xx.comwww.xx.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs;
if ($host ~ "linuxidc\.net") {
rescriere ^(.*) http://www.xx.com$1permanent;
}


6. Variabile globale nginx
arg_PARAMETER #这个变量包含GET请求中, dacă există un PARAMETRU variabil.
args #这个变量等于请求行中 parametri (cerere GET), de exemplu, foo=123&bar=blahblah;
binary_remote_addr #二进制的客户地址.
body_bytes_sent #响应时送出的body字节数数量. Aceste date sunt corecte chiar dacă conexiunea este întreruptă.
Câmp de content_length #请求头中的Content lungime.
Câmp de tip content_type #请求头中的Content.
cookie_COOKIE #cookie valoarea variabilei COOKIE
document_root #当前请求在root指令中指定的值.
document_uri #与uri相同.
Host#请求主机头字段, altfel numele serverului.
Numele gazdă #Set de Numele Gazdă al Mașinii, așa cum este returnat prin GetHostName
http_HEADER
is_args #如果有args参数, această variabilă este egală cu "?", altfel egală cu "", valoare nulă.
http_user_agent #客户端agent信息
http_cookie #客户端cookie信息
limit_rate #这个变量可以限制连接速率.
query_string #与args相同.
request_body_file #客户端请求主体信息的临时文件名.
request_method #客户端请求的动作, de obicei GET sau POST.
remote_addr #客户端的IP地址.
remote_port #客户端的端口.
remote_user #已经经过Auth Numele de utilizator validat de Modulul de bază.
request_completion #如果请求结束, setează-l pe OK. Gol când cererea nu este finalizată sau dacă cererea nu este ultima din lanțul de cereri.
request_method #GET或POST
request_filename #当前请求的文件路径, generat de directive root sau alias și cereri URI.
request_uri #包含请求参数的原始URI, nu conține numele gazdei, de exemplu, "/foo/bar.php?arg=baz". nu poate fi modificată.
Scheme #HTTP方法 (de exemplu http, https).
server_protocol #请求使用的协议, de obicei HTTP/1.0 sau HTTP/1.1.
server_addr #服务器地址, această valoare poate fi determinată după finalizarea unui apel de sistem.
server_name #服务器名称.
server_port #请求到达服务器的端口号.


Șapte. Corespondența dintre regulile Apache și Nginx
RewriteCond-ul lui Apache corespunde cu cel al lui Nginx dacă
RewriteRule a lui Apache corespunde rescrierii lui Nginx
[R] al lui Apache corespunde redirecționării lui Nginx
[P] în apache corespunde ultimului în Nginx
[R,L] al lui Apache corespunde redirecționării lui Nginx
[P,L] al lui Apache corespunde ultimei cărți ale lui Nginx
[PT,L] al lui Apache corespunde ultimei cărți ale lui Nginx


De exemplu, permite unui nume de domeniu specificat să acceseze acest site și apelează întotdeauna la www.xx.com alte nume de domenii
  Apache:
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$ )
{
set $allowHost '1';
}
if( $host ~* ^localhost )
{
set $allowHost '1';
}
if( $host ~* ^192\.168\.1\..(. *?) $ )
{
set $allowHost '1';
}
dacă( $allowHost !~ '1' )
{
rescriere ^/(.*)$ http://www.xx.comredirect ;
}





Precedent:Sina Weibo scanează codul pentru a plăti 1 cent pentru a primi bonusul de sfârșit de an până la yuanul 2015
Următor:CMD5 sparge parola administratorului de sistem Windows
Postat pe 07.12.2014 17:25:05 |
Cititul și postarea înapoi este o virtute
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com