Eins. Reguläre Ausdrucksübereinstimmung, wobei: * ~ ist kleinschreibungsabhängiges Matching * ~* ist eine kleinschreibungslose Übereinstimmung * !~ und !~* sind klein- und kleinschreibungssensitive Fehlanpassungen Zwei. Datei- und Verzeichnis übereinstimmen, wobei: * -f und !-f werden verwendet, um zu bestimmen, ob eine Datei existiert * -d und !-d werden verwendet, um zu bestimmen, ob ein Verzeichnis existiert * -e und !-e werden verwendet, um festzustellen, ob eine Datei oder ein Verzeichnis existiert * -x und !-x werden verwendet, um zu bestimmen, ob eine Datei ausführbar ist oder nicht 3. Der letzte Parameter der Umschreibanweisung ist die Flaggenmarkierung, die mit folgendem markiert ist: 1.last entspricht dem [L]-Zeichen in Apache, was Rewrite bedeutet. 2. Pause Nachdem das Matching dieser Regel abgeschlossen ist, wird das Matching beendet und die nachfolgenden Regeln werden nicht mehr gematcht. 3.Redirect liefert 302 temporäre Redirect, und die Browseradresse zeigt die URL-Adresse nach dem Sprung an. 4.Permanent return 301 Permanent Redirect, die Browseradresse zeigt die URL-Adresse nach dem Sprung an.
Verwenden Sie Last und Break, um URI-Umschreibungen zu implementieren, und die Adressleiste des Browsers bleibt unverändert. Und es gibt einen kleinen Unterschied zwischen den beiden: Die Verwendung des Alias-Befehls muss mit Last markiert werden; Wenn du proxy_pass Direktiven verwendest, musst du das Break-Tag verwenden. Nachdem das letzte Tag in dieser Rewrite-Regel ausgeführt wurde, befindet es sich auf dem Server{......} Tag startet die Anfrage erneut, während das Break-Tag das Match nach Abschluss des Regelmatches beendet. Zum Beispiel: Wenn wir eine URL wie /photo/123456 auf /path/to/photo/12/1234/123456.png umleiten "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png umschreiben ;
Vier. NginxRewrite-Regel
1. Befehl brechen Nutzungsumgebung: Server, Standort, ob; Die Direktive vervollständigt das aktuelle Regelwerk und verarbeitet die Umschreibanweisung nicht mehr.
2. Wenn direktiv, Nutzungsumgebung: Server, Standort Diese Instruktion wird verwendet, um zu prüfen, ob eine Bedingung erfüllt ist, und falls ja, um die Anweisung innerhalb der geschwungenen Klammern auszuführen. Der Befehl If unterstützt kein Verschachteln und unterstützt keine mehreren Bedingungen && sowie || Behandlung.
3. Rückgabekommando Syntax: Returncode ; Nutzungsumgebung: Server, Standort, ob; Diese Anweisung wird verwendet, um die Ausführung der Regel zu beenden und einen Statuscode an den Client zurückzugeben. Beispiel: Wenn die besuchte URL auf ".sh" oder ".bash" endet, wird ein 403-Statuscode zurückgegeben Ort ~ .*\. (sh|bash)?$
{ Rückfahrt 403;
}
4. Befehl umschreiben Syntax: Rewriteregex Ersatz-Flag Nutzungsumgebung: Server, Standort, falls Diese Direktive leitet die URI basierend auf dem Ausdruck um oder modifiziert die Zeichenkette. Die Anweisungen werden in der Reihenfolge der Konfigurationsdatei ausgeführt. Beachten Sie, dass das Umschreiben von Ausdrücken nur für relative Pfade gültig ist. Wenn Sie Hostnamen koppeln möchten, sollten Sie if-Anweisungen verwenden, zum Beispiel unten: wenn( $host ~* www\.(. *) )
{ setze $host_without_www $1; umschreiben ^(.*)$ http://$host_without_www$1permanent;
}
5. Befehl setzen Syntax: Setvariable-Wert; Standard: keine; Nutzungsumgebung: Server, Standort, ob; Diese Direktive wird verwendet, um eine Variable zu definieren und ihr einen Wert zuzuweisen. Der Wert einer Variablen kann Text, Variable oder Vereinigung von Textvariablen sein. Beispiel: set$varname "hello world";
6.Uninitialized_variable_warn Anweisungen Syntax: uninitialized_variable_warnon|off Nutzungsumgebung: http, Server, Standort, falls Dieser Befehl wird verwendet, um die Warnmeldung für nicht initialisierte Variablen ein- und auszuschalten, und der Standardwert ist Ein.
Fünf. Beispiel zum Schreiben von Nginx-Regeln 1. Wenn die abgerufene Datei und das Verzeichnis nicht existieren, leiten Sie auf eine bestimmte php-Datei um. if( !-e $request_Dateiname )
{ ^/(.*)$ index.php Last umschreiben;
}
2. Verzeichnistausch /123456/xxxx ====> /xxxx?id=123456 umschreiben ^/(\d+)/(.+)/ /$2?id=$1 letzt;
3. Wenn der Client den IE-Browser verwendet, leitet er auf das /ie-Verzeichnis um if( $http_user_agent ~ MSIE)
{ Umschreiben ^(.*)$ /ie/$1 Pause;
}
4. Den Zugriff auf mehrere Verzeichnisse deaktivieren Standort ~ ^/(cron|Vorlagen)/
{ alles leugnen; Unterbrechung;
}
5. Den Zugriff auf Dateien, die mit /data beginnen, deaktivieren Standort ~ ^/Data
{ alles leugnen;
}
6. Den Zugriff auf Dateien mit Dateiendungen .sh, .flv .mp3 verbieten Ort ~ .*\. (sh|flv|mp3)$
{ Rückfahrt 403;
}
7. Setzen Sie die Browser-Cache-Zeit für bestimmte Dateitypen ein Ort ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$
{ läuft 30 Pence ab;
} Ort ~ .*\. (js|css)$
{ läuft 1 Stunde ab;
}
8. Setzen Sie Ablaufzeiten für favicon.ico und robots.txt; Hier beträgt die favicon.ico 99 Tage, die robots.txt 7 Tage, und das 404-Fehlerprotokoll wird nicht protokolliert Ort ~(favicon.ico) { log_not_found ab; läuft ab 99D; Unterbrechung;
} Ort ~(robots.txt) { log_not_found ab; läuft 7d ab; Unterbrechung;
}
9. Legen Sie die Verfallszeit eines bestimmten Dokuments fest; Das sind 600 Sekunden, und Zugriffsprotokolle werden nicht erfasst Ort ^~ /html/scripts/loadhead_1.js { access_log ab; root /opt/lampp/htdocs/web; läuft ab 600; Unterbrechung;
}
10. Anti-Hotlink-Dateien und feste Ablaufzeiten Return412 hier ist ein benutzerdefinierter HTTP-Statuscode, der standardmäßig auf 403 eingestellt ist, was praktisch ist, um die richtige Hotlink-Anfrage zu finden "Umschreiben ^/ ; "Zeigt ein Bild eines Anti-Hotlinks "access_log weg;" Es werden keine Zugriffsprotokolle erfasst, was den Stress reduziert "Läuft 3D ab" 3 Tage Browser-Cache für alle Dateien
Standort ~*^.+\. (jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers keine blockierte *.xx.com*.xx.net localhost 208.97.167.194; if ($invalid_referer) { Umschreiben ^/ ; Rückfahrt 412; Unterbrechung;
} access_log ab; root /opt/lampp/htdocs/web; verliert 3D; Unterbrechung;
}
11. Nur mit Passwort einen festen IP-Zugriff auf die Website erlauben
root /opt/htdocs/www; erlaubt 208.97.167.194; allow 222.33.1.2; erlaubt 231.152.49.4; alles leugnen; auth_basic "C1G_ADMIN"; auth_basic_user_file htpasswd;
12Konvertiere Dateien in mehrstufigen Verzeichnissen in eine Datei, um SEO-Effekte zu verbessern
/job-123-456-789.html 指向/job/123/456/789.html
umschreiben^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html letzt;
13. Weiterleiten, wenn Dateien und Verzeichnisse nicht existieren:
if (!-e $request_filename) { proxy_pass http://127.0.0.1;
}
14. Einen Ordner im Root-Verzeichnis auf das Level-2-Verzeichnis verweisen Zum Beispiel zeigt /shanghaijob/ auf /area/shanghai/ Wenn du die letzte auf permanent änderst, lautet die Adressleiste des Browsers /standort/shanghai/ umschreiben ^/([0-9A-Z]+)job/(.*)$ /area/$1/$2last; Das Problem mit dem obigen Beispiel ist, dass es beim Zugriff auf /shanghai nicht übereinstimmt umschreiben ^/([0-9A-Z]+)job$ /area/$1/ letzt; umschreiben ^/([0-9A-Z]+)job/(.*)$ /area/$1/$2last; Dieser Weg/Shanghai ist ebenfalls zugänglich, aber die zugehörigen Links auf der Seite sind nicht verfügbar, Wenn ./list_1.html echte Adresse /area/shanghia/list_1.html ist, wird sie zu /list_1.html, wodurch sie unzugänglich wird. Dann kann ich kein automatisches Springen hinzufügen (-d $request_filename) hat die Bedingung, dass es sich um ein echtes Verzeichnis handeln muss, und mein Rewrite ist es nicht, sodass es keine Wirkung hat if (-d $request_filename){ umschreiben ^/(.*)([^/])$ http://$host/$1$2/permanent;
} Es ist einfach, wenn man den Grund kennt, lass mich manuell springen. umschreiben ^/([0-9a-z]+)job$ /$1job/permanent; umschreiben ^/([0-9A-Z]+)job/(.*)$ /area/$1/$2last;
15. Domainnamen-Sprung Server
{ hören 80; server_name jump.linuxidc.com; Index index.html index.htm index.php; root /opt/lampp/htdocs/www; umschreiben ^/ http://www.xx.com/; access_log ab;
}
16. Multi-Domain-Drehen server_name www.xx.comwww.xx.com; Index index.html index.htm index.php; root /opt/lampp/htdocs; if ($host ~ "linuxidc\.net") { umschreiben ^(.*) http://www.xx.com$1permanent;
}
6. nginx globale Variablen arg_PARAMETER #这个变量包含GET请求中, wenn es eine Variable PARAMETER gibt. args #这个变量等于请求行中 (GET-Anfrage) Parameter, z. B. foo=123&bar=blahblah; binary_remote_addr #二进制的客户地址. body_bytes_sent #响应时送出的body字节数数量. Diese Daten sind auch dann korrekt, wenn die Verbindung unterbrochen wird. content_length #请求头中的Content Länge Feld. content_type #请求头中的Content-Typ Feld. cookie_COOKIE #cookie den Wert der COOKIE-Variablen document_root #当前请求在root指令中指定的值. document_uri #与uri相同. Host #请求主机头字段, ansonsten der Servername. Hostname #Set zum Hostname von TheMachine, wie er von gethostname zurückgegeben wird http_HEADER is_args #如果有args参数 ist diese Variable gleich "?", ansonsten gleich "", Nullwert. http_user_agent #客户端agent信息 http_cookie #客户端cookie信息 limit_rate #这个变量可以限制连接速率. query_string #与args相同. request_body_file #客户端请求主体信息的临时文件名. request_method #客户端请求的动作, meistens GET oder POST. remote_addr #客户端的IP地址. remote_port #客户端的端口. remote_user #已经经过Auth Benutzername vom Basic Module validiert. request_completion #如果请求结束, stell es auf OK. Leer, wenn die Anfrage nicht abgeschlossen ist oder wenn die Anfrage nicht die letzte in der Anforderungskette ist. request_method #GET或POST request_filename #当前请求的文件路径, erzeugt durch Root- oder Alias-Direktiven und URI-Anfragen. request_uri #包含请求参数的原始URI enthält sie nicht den Hostnamen, z. B. "/foo/bar.php?arg=baz". kann nicht modifiziert werden. Scheme #HTTP方法 (z. B. HTTP, https). server_protocol #请求使用的协议, meist HTTP/1.0 oder HTTP/1.1. server_addr #服务器地址 kann dieser Wert nach Abschluss eines Systemaufrufs bestimmt werden. server_name #服务器名称. server_port #请求到达服务器的端口号.
Sieben. Korrespondenz zwischen den Apache- und Nginx-Regeln Apache's RewriteCond entspricht Nginx', wenn Apaches RewriteRule entspricht Nginx' Rewrite Apaches [R] entspricht Nginx' Umleitung [P] in Apache entspricht dem letzten in Nginx Apaches [R,L] entspricht Nginx' Redirection Apaches [P,L] entspricht Nginx' letzter Apaches [PT,L] entspricht Nginx' letzter
Zum Beispiel erlauben Sie einer bestimmten Domain den Zugriff auf diese Seite und wenden Sie sich immer zu www.xx.com anderen Domainnamen 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$ )
{ gesetzt $allowHost '1';
} if( $host ~* ^localhost )
{ gesetzt $allowHost '1';
} wenn( $host ~* ^192\.168\.1\.(. *?) $ )
{ gesetzt $allowHost '1';
} wenn( $allowHost !~ '1' )
{ umschreiben ^/(.*)$ http://www.xx.comredirect ;
}
|