nginx_logo_klein2

Rewrite-Rules: Apache vs Nginx

closeDieser Beitrag wurde vor mehr als drei Monaten veröffentlicht. Bedenke bitte, dass die hier angebotene Information nicht mehr aktuell und gültig sein könnte. Informiere dich daher bitte auch an anderer Stelle über dieses Thema. Sollten sich neue Informationen ergeben haben, so kannst du mich auch gerne auf diese über einen Kommentar hinweisen. Vielen Dank!

Bei dem Apache Webserver wird das URL-Handling (Rewrite-Rules) via .htaccess gesteuert, sobald sich eine Datei mit diesem Namen in einem Verzeichnis befindet, werden die darin enthaltenen Befehle vom Apache umgesetzt. Da dieses Verfahren jedoch voraussetzt, dass alle Verzeichnisse zuvor auf eine solche Datei geprüft, diese anschließend eingelesen und verarbeitet werden muss, macht es Sinn wie z.B. beim Nginx Webserver diese in die Konfiguration des Webs aufzunehmen. Leider ist die Syntax und Logik dieser beiden Rewrite-Rules nicht kompatibel, daher folgt eine Einführung in dieses Thema … außerdem habe ich auf github.com/voku/ meine kompletten Konfigurationsdaten für Nginx + PHP + MySQL hochgeladen.

 

Erklärung: einfache Weiterleitung

 

Apa­che:

Redirect /altes_Verzeichnis/alte_Seite.html http://suckup.de/

 

Nginx: 

rewrite /altes_Verzeichnis/alte_Seite.html http://suckup.de/ last;

 

Falls “/altes_Verzeichnis/alte_Seite.html” hinter deiner Domain in der URL steht, wird die Anfrage auf die Domain “meine_domain.de” umgeleitet.

z.B. http://suckup.de/altes_Verzeichnis/alte_Seite.html

 

Erklärung: Domain Weiterleitung

 

Apa­che:

RewriteCond %{HTTP_HOST} ^voku-online.de$ [NC]
RewriteRule ^(.*)$ http://www.suckup.de/$1 [R=301,L]

 

%{HTTP_HOST} -> Hostname

 

Nginx: 

if ($host ~* voku-online.de) {
rewrite ^(.*)$ http://suckup.de$1 permanent;
}

 

Fall der Hostname “voku-online.de” ist, dann wird dieser zu “suckup.de” umgeschrieben und alles was hinter der ursprünglichen Hostnamen stand, wird hinter den neuen gesetzt. 

^ -> Anfang 

.* -> “.” ein beliebiges Zeichen, “*” Wiederholung => alle beliebigen Zeichen

( ) -> erstes Vorkommen der einfachen Klammern wird zur ersten Variable $1 … u.s.w.

$ -> Ende

z.B. http://voku-online.de/altes_Verzeichnis/alte_Seite.html

 

Erklärung: entferne doppelte “/”

 

Apa­che:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

 

 %{REQUEST_URI} -> URL ohne Parameter

 ( ) -> erstes Vorkommen der einfachen Klammern in der “RewriteCond”-Bedingung wird zur ersten Variable %1 … u.s.w.

 

Nginx: 
if ($request_uri ~* “\/\/”) {
rewrite ^(.*)$ $scheme://$host$1 permanent;
}

 

\/ -> Escapezeichen “\” vor “/”

$scheme -> http bzw. https

$host -> Hostname

permanent -> gibt den Statuscode 301 zurück

 

Erklärung: statische Dateien (.css/.js/.html) beschleunigen

 

Nginx:

## static files are served directly
location ~* \.(?:js|css|htm?|js\?ver.*|css\?ver.*)$ {
        set $betterForCache  0;

        if ($args ~* ver=(.*)$) {
                set $betterForCache  1;
        }
        if ($request_uri ~* “/wp-admin”) {
                set $betterForCache  0;
        }
        if ($betterForCache = 1) {
                rewrite ^(.*) $scheme://$host$uri? last;
        }

        gzip_static on;

        autoindex off;
        expires 1d;
        add_header Pragma public;
        # We bypass all delays in the post-check and pre-check parameters of Cache-Control. Both set to 0.
        add_header Pragma public;
        add_header Cache-Control “public, must-revalidate, proxy-revalidate, post-check=0, pre-check=0″;
        ## No need to bleed constant updates. Send the all shebang in one
        ## fell swoop.
        tcp_nodelay off;
        ## Set the OS file cache.
        open_file_cache max=3000 inactive=120s;
        open_file_cache_valid 45s;
        open_file_cache_min_uses 2;
        open_file_cache_errors off;
        break;
}

Verschachtelte if-Abfragen kann man einfach via Hilfsvariablen (z.B. $betterForCache) erstellen …

$uri -> URL ohne Parameter

z.B.: http://suckup.de/wp-content/themes/mystique/css/core.css?ver=3.3.2

 

weitere Infos:

- Nginx & HttpRewriteModule:  http://wiki.nginx.org/HttpRewriteModule

- Apache & mod_rewrite: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

- Beispiel-Konfiguration (WordPress Multi: Nginx + PHP-FPM): https://github.com/voku/CONFIG–nginx—php-fpm—mysql

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 4.00 out of 5)
  • http://wpcoder.de Sergej Müller

    Schön zusammengefasst. An sich sollte man die Anzahl der if-Abfragen soweit es geht reduzieren und bei URLs auf location umschwenken, da dies schneller ist und die weitere Abarbeitung je nach Ausdruck abbricht.

    Finde leider nicht den Link zum Post…