Nginx Rewrite Regeln für OXID eShop

Der OXID eShop ist primär auf den HTTP-Server Apache2 ausgelegt. Eine Suche ergab entweder nur Konfigurationsfragmente oder nicht funktionierende Lösungen. Wir haben einen der Suchtreffer genommen und die Rewrite Regeln vom Apache-Modul „mod_rewrite“ auf eine Nginx VHost Konfiguration portiert.

Der OXID eShop ist nun unter der folgenden Software-Konstellation lauffähig:

  • Ubuntu 10.04.3 LTS
  • Nginx 0.7.65-1ubuntu2.1
  • PHP 5.3.2-1ubuntu4.10 (FastCGI)
  • OXID eShop 4.5.4 CE

Konfigurationsvorlage: VHost

Um die Konfiguration zu übernhemen, muss diese Vorlage in einer Konfigurationsdatei für die VHosts gespeichert werden. Das Standardverzeichnis unter Ubuntu ist hierbei /etc/nginx/sites-available/ mit einem Symlink in /etc/nginx/sites-enabled.
Ferner sind die Konfigurationsparameter listen, server_name, root und index (optional: access_log und error_log) zu ergänzen. Ebenfalls muss, bei abweichender Konfiguration, die IP und/oder der Port für die Weiterleitung an den PHP-FastCGI-Prozess (in Zeile 7) angepasst werden.

server {
    # Hier die eigene VHost-Konfiguration einfügen
    #   listen, server_name, root, access_log, error_log, index
    
    # OXID eShop Rewrite Regeln
    set $script_name $fastcgi_script_name;
    set $fcgi_php 127.0.0.1:9000;

    # Im Admin und Setup wird kein Rewrite auf die oxseo.php benötigt.
    location ~ ^/(setup|admin)/?$ {
        set $script_name /$1/index.php;
        include fastcgi_params.oxid;
    }

    # Zugriff auf die internen Dateien und Apache's ".ht" Dateien verweigern.
    location ~ (/\.ht|EXCEPTION_LOG\.txt|\.log$|\.tpl$|pkg.rev) {
            deny  all;
    }

    # OXID 4.5.2+ spezifisch
    location ~ /out/pictures/.*(\.jpg|\.gif|\.png)$ {
            try_files $uri /core/utils/getimg.php;
    }

    # Für das "out" Verzeichnis sind keine Rewrite-Regeln anzuwenden.
    location ~ /(core|export|modules|out|tmp|views)/ {
    }
    
    # OXID eShop Setup: Prüfung auf "mod_rewrite".
    location = /oxseo.php {
        if ($args ~ "mod_rewrite_module_is=off") {
            rewrite /oxseo.php /oxseo.php?mod_rewrite_module_is=on? break;
        }
        
        set $script_name oxseo.php;
        include fastcgi_params.oxid;
    }

    # PHP-Dateien über PHP-FastCGI ausführen.
    location ~ \.php$ {
        # Zero-day exploit defense.
        # http://forum.nginx.org/read.php?2,88845,page=3
        try_files $uri =404;
        include fastcgi_params.oxid;
    }

    # SEO URLs auf die oxseo.php leiten.
    location / {
        if (!-e $request_filename) {
            set $script_name /oxseo.php;
        }
        
        include fastcgi_params.oxid;
    }

    # Anfragen auf das Root Dokument auf die index.php leiten.
    location = / {
            fastcgi_index index.php;
            set $script_name $fastcgi_script_name;
            include fastcgi_params.oxid;
    }

}

 

Konfigurationsdatei: fastcgi_params.oxid

Die Datei fastcgi_params wurde für die Verwendung von OXID eShop ebenfalls angepasst. Sie trägt den Namen fastcgi_params.oxid und liegt im Verzeichnis /etc/nginx/.

fastcgi_param  SCRIPT_FILENAME    $document_root$script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

fastcgi_pass $fcgi_php;

Fehlermeldungen und Verbesserungsvorschläge sind herzlich willkommen und können als Kommentar angehängt werden.

8 Kommentare

  1. mitlerweile wissen viele wie das mit nginx und oxid geht, aber irgendwie scheint jeder zu ignorieren, dass der shop SSL braucht (sofern man produktiv arbeitet und nicht rumspielt)…. und die config dazu zeigt niemand… ist dies das letzte geheimnis der nginx/oxid welt ? ;)

    1. Nicht jeder braucht SSL auf den App-Servern ;-) SSL-Offloading wird normalerweise (ab einer gewissen Größe des Shops) von Hardware übernommen, die auch die nötige Spezialisierung dafür besitzt. Und kleinere Shops werden den Unterschied nicht so extrem merken

  2. Servus,

    sehr schicke Konfigurationsvorlage!

    Man kann vielleicht noch dazu sagen, dass $quot; in Zeile 31 mit einem “ ersetzt werden sollte.

    Für die Oxid-Installation grünes Licht und Demoserver läuft bei mir!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert