Heim >Backend-Entwicklung >PHP-Tutorial >Etwas über Nginx-Konfigurationsdateien und ReWriteUrl~

Etwas über Nginx-Konfigurationsdateien und ReWriteUrl~

WBOY
WBOYOriginal
2016-07-30 13:29:341006Durchsuche

Anweisungen im Zusammenhang mit Nginx-Rewrite-Regeln
Anweisungen im Zusammenhang mit Nginx-Rewrite-Regeln umfassen „If“, „Rewrite“, „Set“, „Return“, „Break“ usw., wobei „Rewrite“ die kritischste Anweisung ist. Eine einfache Syntax für eine Nginx-Rewrite-Regel lautet wie folgt:

rewrite ^/b/(.*).html /play.php?video=$1 break;

Wenn Sie eine hinzufügen if-Anweisung, ein Beispiel lautet wie folgt:

if (!-f $request_filename)

rewrite ^/img/(.*)$ /site/$host/images/$1 last;

Vergleich von Rewrite-Regelbeispielen zwischen Nginx und Apache

Es gibt keinen großen Unterschied zwischen einfachen Nginx- und Apache-Rewrite-Regeln und sie sind grundsätzlich vollständig kompatibel. Zum Beispiel:

Apache Rewrite Rule:

RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

RewriteRule ^ / ceshi/$ /zl/ceshi.php [L]

RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [ L]

RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]

Nginx Rewrite Rule:

rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

rewrite ^/ceshi/$ /zl/ceshi.php last;

rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;

rewrite ^/pingce([0-9]* ) /$ /zl/pingce.php?id=$1 last;

Wie aus dem obigen Beispiel ersichtlich ist, werden die Rewrite-Regeln von Apache in die Rewrite-Regeln von Nginx geändert. Es ist eigentlich sehr einfach: Die RewriteRule-Direktive von Apache ist Durch das Nginx-Tag ersetzt. In der Rewrite-Anweisung wird das [L]-Tag von Apache durch das letzte Tag von Nginx ersetzt, und der Inhalt in der Mitte bleibt unverändert.

Wenn Sie den Befehl nginx -t verwenden, um zu überprüfen, ob die Konfigurationsdatei nginx.conf Syntaxfehler aufweist, nachdem Sie die Rewrite-Regeln von Apache in die Rewrite-Regeln von Nginx geändert haben, können Sie versuchen, den Bedingungen Anführungszeichen hinzuzufügen. Beispielsweise meldet die folgende Nginx-Rewrite-Regel einen Syntaxfehler:

rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;

Hinzufügen Die Anführungszeichen sind korrekt:
rewrite „^/([0-9]{5}).html$“ /x.jsp?id=$1 last;

Die Rewrite-Regeln von Apache und Nginx sind in Es gibt subtile Unterschiede bei URL-Sprüngen:

Apache Rewrite Rule:
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301 ,L]

Nginx Rewrite-Regeln:
rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent;

Im obigen Beispiel ist uns aufgefallen, dass „http://$host“ zur Ersetzungszeichenfolge der Nginx-Rewrite-Regel hinzugefügt wurde, die in Nginx erforderlich ist.

Darüber hinaus unterscheiden sich die Rewrite-Regeln von Apache und Nginx auch in den Variablennamen, zum Beispiel:

Apache Rewrite-Regel:
RewriteRule ^/user/login/$ /user/ login.php ?login=1&forward=http://%{HTTP_HOST} [L]

Nginx Rewrite-Regeln:
rewrite ^/user/login/$ /user/login.php?login=1&forward =http: //$host last;

Die Entsprechung zwischen einigen Anweisungen und Tags mit gleichen oder ähnlichen Funktionen zwischen Apache und Nginx Rewrite-Regeln:

Apaches RewriteCond-Anweisung entspricht der if-Anweisung von Nginx;
Apache Die RewriteRule-Anweisung entspricht der Rewrite-Anweisung von Nginx;
Apaches [R]-Markierung entspricht der Nginx-Umleitungsmarkierung;
Apaches [R,L]-Markierung; mark Entspricht dem Weiterleitungs-Tag von Nginx;
Apaches [P, L]-Tag entspricht dem letzten Tag von Nginx;

lässt bestimmte Domänennamen zu Beim Besuch dieser Website springen alle anderen Domainnamen zu http://www.aaa.com

Apache Rewrite-Regeln:

RewriteCond %{HTTP_HOST} ^(.*?).domain.com$

RewriteCond %{HTTP_HOST} !^qita.domain.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index .htm [L]

Die if-Anweisung von Nginx unterstützt weder die Verschachtelung noch den Abgleich mit mehreren Bedingungen wie AND und OR. Im Vergleich zu Apaches RewriteCond ist dies jedoch problematischer Seite Nginx-Konfigurationsschreibmethode zur Implementierung dieses Beispiels:

Nginx-Rewrite-Regel:

if ($host ~* ^(.*?).domain.com$) set $var_wupin_city $1;

set $var_wupin '1′;

if ($host ~* ^qita.domain.com$)

set $var_wupin '0′;

if (!-f $document_root /market/$var_wupin_city/index.htm)

$var_wupin '0′ setzen;

if ($var_wupin ~ '1′)

^/wu umschreiben /$ /market/$var_wupin_city/index.htm last;

}


Syntax umschreiben

Syntax:

Regex-Ersetzungsflag umschreiben

Standard:

keine

Geltungsbereich:

Server, Standort, wenn

Diese Direktive ändert den URI gemäß regulärer Ausdruck und die Ersetzungszeichenfolge werden in der Reihenfolge ihres Auftretens in der Konfigurationsdatei ausgeführt.

Diese Direktive ändert den URI oder modifiziert die Zeichenfolge basierend auf dem Ausdruck. Die Anweisungen werden entsprechend der Reihenfolge in der Konfigurationsdatei ausgeführt.

Beachten Sie, dass der Rewrite-Regex nur mit dem relativen Pfad und nicht mit der absoluten URL übereinstimmt. Wenn Sie den Hostnamen abgleichen möchten, sollten Sie eine if-Bedingung verwenden, etwa so:

Hinweis zum Umschreiben Der Ausdruck ist nur für relative Pfade gültig. Wenn Sie Hostnamen koppeln möchten, sollten Sie eine if-Anweisung verwenden.

rewrite schreibt nur den Pfadteil neu und ändert nicht die Eingabeparameter des Benutzers. Daher müssen Sie sich in der if-Regel hier nicht um die vom Benutzer im Browser eingegebenen Parameter kümmern Umschreiben. Deshalb haben wir gerade eins hinzugefügt? Nr. und einen kleinen Parameter, den wir später brauchen, ***https=1.

Nginx-Rewrite-Regelreferenz:

  1. ~ ist ein Matching, bei dem die Groß-/Kleinschreibung beachtet wird.
  2. ~* ist ein Matching, bei dem die Groß-/Kleinschreibung nicht beachtet wird.
  3. !~ und !~* sind Nichtübereinstimmungen zwischen Groß- und Kleinschreibung bzw. Nichtübereinstimmungen

  1. -f und !-f werden verwendet, um festzustellen, ob die Datei vorhanden ist
  2. -d und !-d werden verwendet, um festzustellen, ob ein Verzeichnis vorhanden ist
  3. -e und !-e werden verwendet, um festzustellen, ob eine Datei oder ein Verzeichnis vorhanden ist
  4. -x und !- x Wird verwendet, um zu bestimmen, ob die Datei ausführbar ist

  1. last entspricht der [L]-Markierung in Apache und zeigt den Abschluss des Umschreibens an, haha ​​​​​​das sollte so sein Die am häufigsten verwendete
  2. Pause beendet den Abgleich und stimmt nicht mehr mit nachfolgenden Regeln überein
  3. Umleitung gibt 302 temporäre Umleitung zurück und die Adressleiste wird nach dem Sprung angezeigt
  4. Permanent gibt 301 permanent zurück Umleitung und die Adressleiste werden angezeigt. Adresse nach Sprung

  1. $args
  2. $content_length
  3. $content_type
  4. $document_root
  5. $document_uri
  6. $host
  7. $http_user_agent
  8. $http_cookie
  9. $limit_rate
  10. $request_body_file
  11. $request_method
  12. $remote_addr
  13. $remote_port
  14. $remote_user
  15. $request_filename
  16. $ request_uri
  17. $query_string
  18. $scheme
  19. $server_protocol
  20. $server_addr
  21. $server_name
  22. $server_port
  23. $ uri

Beispiel für die Kombination von QeePHP

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

Mehrere Verzeichnisse in Parameter konvertieren
abc.domian.com/sort /2 => abc .domian.com/index.php?act=sort&name=abc&id=2

  1. if ($host ~* (.*).domain.com) {
  2. set $sub_name $1;
  3. rewrite ^/sort/(d+)/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
  4. }

Verzeichnistausch
/123456/xxxx -> /xxxx?id=123456

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

Zum Beispiel leitet die folgende Einstellung nginx den Benutzer zum Verzeichnis /nginx-ie um, wenn er ie verwendet:

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

Das Verzeichnis wird automatisch mit „/“ hinzugefügt

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

htaccess verboten

  1. Standort ~/.ht {
  2. Alles verweigern;
  3. }

Mehrere Verzeichnisse nicht zulassen

  1. Standort ~ ^/(cron|templates) / {
  2. deny all;
  3. break;
  4. }

Dateien deaktivieren, die mit / beginnen data
kann deaktiviert werden. Anfragen wie .log.txt in mehrstufigen Verzeichnissen unter /data/;

  1. location ~ ^/data {
  2. alle verweigern ;
  3. }

Ein einzelnes Verzeichnis blockieren
.log.txt-Anfrage kann nicht gesperrt werden

  1. Standort/Suchwort/ cron/ {
  2. deny all;
  3. }

Einzelne Dateien nicht zulassen

  1. location ~ /data /sql/data.sql {
  2. deny all;
  3. }

Legen Sie die Ablaufzeit für favicon.ico und robots.txt fest;
hier sind es 99 Tage für favicon.ico, robots.txt ist 7 Tage und zeichnet keine 404-Fehlerprotokolle auf

  1. location ~(favicon.ico) {
  2. log_not_found aus;
  3. läuft 99 Tage ab;
  4. Pause;

  5. Standort ~(robots.txt) {
  6. log_not_found off;
  7. expires 7d;
  8. break;
  9. }
Legen Sie die Ablaufzeit von a fest Datei; hier beträgt sie 600 Sekunden und wird nicht aufgezeichnet. Zugriffsprotokoll

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

  1. access_log off;
  2. root /opt/lampp/htdocs/web ;
  3. expires 600;
  4. break;
  5. }
File anti -Hotlinking und Ablaufzeit festlegenhier Return 412 ist ein benutzerdefinierter HTTP-Statuscode, der Standardwert ist 403, was praktisch ist, um die richtige Hotlink-Anfrage zu finden

"rewrite ^/ http://leech.divmy.com/ leech.gif;“ zeigt ein Anti-Hotlink-Bild an
„access_log off;“ Keine Zugriffsprotokolle aufzeichnen, Stress reduzieren
„expires 3d“ Browser-Cache aller Dateien für 3 Tage

  1. Standort ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
  2. valid_referers keine blockiert *.c1gstudio. com *.c1gstudio.net localhost 208.97.167.194;
  3. if ($invalid_referer) {
  4. rewrite ^/ http://leech.divmy.com/leech.gif;
  5. return 412;
  6. break;
  7. }
  8. access_log off;
  9. root /opt/lampp/htdocs/web;
  10. läuft 3 Tage ab;
  11. Pause;
  12. }

Nur ​​festen IP-Zugriff auf die Website erlauben und Passwort hinzufügen

  1. root /opt/htdocs/www;
  2. allow 208.97.167.194;
  3. allow 222.33.1.2;
  4. allow 231.152.49.4;
  5. alles verweigern;
  6. auth_basic „C1G_ADMIN“;
  7. auth_basic_user_file htpasswd;

Dateien in mehrstufigen Verzeichnissen in eine Datei konvertieren, verbesserter SEO-Effekt
/job-123-456-789.html verweist auf /job/123/456/789.html

  1. rewrite ^/job-([0-9]+ ) -([0-9]+)-([0-9]+).html$ /job/$1/$2/jobshow_$3.html last;

Ändern Sie das Stammverzeichnis Der nächste Ordner verweist auf das Verzeichnis der zweiten Ebene
, z. B. /shanghaijob/ verweist auf /area/shanghai/
Wenn Sie „Last“ auf „Permanent“ ändern, wird in der Adressleiste des Browsers /location/shanghai/

    rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
Das Obige Beispiel: Das erste Problem besteht darin, dass beim Zugriff auf /shanghai nicht mit

    rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
  1. schreiben Sie ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
Auf diese Weise um, Auf /shanghai kann ebenfalls zugegriffen werden, relative Links auf der Seite können jedoch nicht verwendet werden.

Wenn die tatsächliche Adresse von ./list_1.html beispielsweise /area/shanghia/list_1.html lautet, wird sie zu /list_1.html , wodurch es unzugänglich wird.

Dann funktioniert es nicht, wenn ich einen automatischen Sprung hinzufüge

(-d $request_filename) Es gibt eine Bedingung, dass es sich um ein echtes Verzeichnis handeln muss, mein Umschreiben jedoch nicht, also hat es keine Auswirkung

    if (-d $request_filename){
  1. rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent ;
  2. }
Es wird einfacher, sobald Sie den Grund kennen, lassen Sie mich manuell springen

    umschreiben ^/( [0-9a -z]+)job$ /$1job/ permanent;
  1. schreiben Sie ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 zuletzt um ;
Umleiten, wenn die Datei oder das Verzeichnis nicht existiert:

    if (!-e $request_filename) {
  1. Proxy_Pass http://127.0.0.1;
  2. }
Domainname Jump

    Server
  1. {
  2. listen 80;
  3. server_name jump.88dgw.com;
  4. index index.html index.htm index.php;
  5. root /opt/ lampp/htdocs/ www;
  6. rewrite ^/ http://www.88dgw.com/;
  7. access_log off;
  8. }
Multi-Domain-Namensumleitung

    Servername www.7oom.com/ www.divmy.com/;
  1. index index.html index.htm index. php;
  2. root /opt/lampp/htdocs;
  3. if ($host ~ „c1gstudio.net“) {
  4. rewrite ^(.*) http:// www.7oom.com$1 / Permanent;
  5. }
Domainnamensprung der dritten Ebene

    if ($http_host ~* „^(.* ).i.c1gstudio.com$“) {
  1. rewrite ^(.*) http://top.88dgw.com$1/;
  2. break;
  3. }
Domain Name Mirror

    Server
  1. {
  2. listen 80 ;
  3. server_name mirror.c1gstudio.com;
  4. index index.html index.htm index.php;
  5. root /opt/lampp/htdocs/www;
  6. rewrite ^/( .*) http://www.divmy.com/$1 last;
  7. access_log off;
  8. }
In ein bestimmtes Unterverzeichnis spiegeln

    Standort ^~ /zhaopinhui {
  1. umschreiben ^.+ http://zph.divmy.com/ last;
  2. break;
  3. }
discuz ucenter home (uchome) rewrite

    rewrite ^/(space|network) -(.+). html$ /$1.php?rewrite=$2 last;
  1. rewrite ^/(space|network).html$ /$1.php last;
  2. rewrite ^/ ([0-9] +)$ /space.php?uid=$1 last;
discuz 7 rewrite

  1. ^(.*)/archiver/((fid|tid)-[w-]+.html)$ $1/archiver/index.php?$2 zuletzt umschreiben;
  2. rewrite ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3 last;
  3. ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/viewthread.php?tid=$2&extra=page umschreiben =$4&page=$3 last;
  4. rewrite ^(.*)/profile-(username|uid)-(.+).html$ $1/viewpro.php?$2=$3 last;
  5. rewrite ^(.*)/space-(username|uid)-(.+).html$ $1/space.php?$2=$3 last;
  6. rewrite ^(.*)/tag- (.+).html$ $1/tag.php?name=$2 last;

给discuz某版块单独配置域名

  1. server_name bbs.c1gstudio.com news.c1gstudio.com;

  2. location = / {
  3. if ($http_host ~ news.divmy.com$) {
  4. umschreiben ^.+ http://news.divmy.com/forum-831-1.html letzte;
  5. Pause;
  6. }
  7. }

discuz ucenter 头像 rewrite 优化

  1. location ^~ /ucenter {
  2. location ~ .*.php?$
  3. {
  4. #fastcgi_pass  unix:/tmp/php-cgi.sock;
  5. fastcgi_pass  127.0.0.1:9000;
  6. fastcgi_index index.php;
  7. include fcgi.conf;
  8. }

  9. location /ucenter/data/avatar {
  10. log_not_found off;
  11. access_log   off;
  12. location ~ /(.*)_big.jpg$ {
  13. error_page 404 /ucenter/images/noavatar_big.gif;
  14. }
  15. Standort ~ /(.*)_middle.jpg$ {
  16. error_page 404 /ucenter/images/noavatar_middle.gif;
  17. }
  18. Standort ~ /(.*)_small.jpg$ {
  19. error_page 404 /ucenter/images/noavatar_small.gif;
  20. }
  21. läuft 300 ab;
  22. Pause ;
  23. }
  24. }

jspace rewrite

  1. location ~ .*.php?$
  2. {
  3. #fastcgi_pass  unix:/tmp/php-cgi.sock;
  4. fastcgi_pass  127.0.0.1:9000;
  5. fastcgi_index index.php;
  6. include fcgi.conf;
  7. }

  8. location ~* ^/index.php/
  9. {
  10. rewrite ^/index.php/(.*) /index.php?$1 break;
  11. fastcgi_pass  127.0.0.1:9000;
  12. fastcgi_index index.php;
  13. include fcgi.conf;
  14. }

另外这里还有一个工具可以直接把apache规则转化为nginx规则

http: //www.anilcetin.com/convert-apache-htaccess-to-nginx/

参考:

http://wiki.nginx.org/NginxChsHttpRewriteModule

http ://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspx

http://www.divmy.com/

Die Verwendung von Nginx und der ReWriteUrl-App ist für die Verwendung mit PHP und PHP geeignet所帮助.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn