# nginx rewrite Regeln



## DripleX (19. Aug. 2013)

Ich habe vor kurzen einen Serverumzug vollziehen müssen.
Dabei bin ich von Debian Squeeze mit Apache2 auf Server Debian Wheezey mit Nginx umgestiegen. Ich bin nach folgender Anleitung vorgegangen:
The Perfect Server - Debian Wheezy (nginx, BIND, Dovecot, ISPConfig 3) | HowtoForge - Linux Howtos and Tutorials

Ich habe einen privaten Bilderuploadservice das "MatPo Image Hosting Script".
Dieses liegt in dem Unterordner "/web/subdomains/bilder/service/"
Eine Subdomain http://bilder.***.de leitet auf diesen Ordner um.

Das Script hat folgende .htaccess Datei:

```
AddDefaultCharset utf-8
<IfModule mod_rewrite.c>
	RewriteEngine On
#de.matpo.mihs.importer.1.4.2
	RewriteRule ^archiv.html$ archiv.php
	RewriteRule ^bild/(.*)/(.*)$ bild.php?bild=$1&bild_name=$2
	RewriteRule ^thumb/(.*)/(.*)$ bild.php?tumbnail=2&bild=$1&bild_name=$2
#/de.matpo.mihs.importer.1.4.2
	RewriteRule ^([a-z0-9\_\.]+).html$ index.php?seite=$1 [L,QSA]
#/de.matpo.mihs
	RewriteRule ^profil-([0-9]+).html$ index.php?seite=mitglieder.$1 [L,QSA]
	RewriteRule ^display-([a-z0-9]+).html$ index.php?seite=display&img=$1 [L,QSA]
	RewriteRule ^display.([a-z0-9]+)-([a-z0-9]+).html$ index.php?seite=display.$1&img=$2 [L,QSA]
	RewriteRule ^images-([a-z0-9]+).([a-z0-9]+)$ images.php?img=$1
	RewriteRule ^(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ images.php?img=$2,$1
#/de.matpo.mihs.mihs
#de.matpo.mfw.page.mod_rewrite.add#
</IfModule>
# Text für individuelle Fehleranzeige
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
ErrorDocument 410 /index.php
ErrorDocument 500 /index.php
```
Ich habe nun mit Hilfe von htaccess to nginx converter , das Script in die nginx "Sprache" übersetzen lassen.

```
# nginx configuration

charset utf-8;

error_page 500 /index.php;

error_page 404 /index.php;

error_page 403 /index.php;

location = /archiv.html {
  rewrite ^(.*)$ /archiv.php;
}

location /bild {
  rewrite ^/bild/(.*)/(.*)$ /bild.php?bild=$1&bild_name=$2;
}

location /thumb {
  rewrite ^/thumb/(.*)/(.*)$ /bild.php?tumbnail=2&bild=$1&bild_name=$2;
  rewrite ^/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$2,$1;
}

location / {
  rewrite ^/([a-z0-9\_\.]+).html$ /index.php?seite=$1 break;
}

location /profil {
  rewrite ^/profil-([0-9]+).html$ /index.php?seite=mitglieder.$1 break;
}

location /display {
  rewrite ^/display-([a-z0-9]+).html$ /index.php?seite=display&img=$1 break;
  rewrite ^/display.([a-z0-9]+)-([a-z0-9]+).html$ /index.php?seite=display.$1&img=$2 break;
}

location /images {
  rewrite ^/images-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$1;
}

location /ihsthumb {
  rewrite ^/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$2,$1;
}
```
In den service Ordner habe ich eine nginx.conf Datei mit dem obigen Inhalt erzeugt. Ich habe dann in ISPConfig 3 in den Domain Optionen bei "nginx Direktiven" folgendes hinzugefügt.

```
include /var/www/***.de/web/subdomains/bilder/service/nginx.conf
```
Das Problem ist, das die Rewrite Regeln nicht funktionieren, da sie wahrscheinlich falsch übersetzt worden sind. Leider kenne ich mich damit nicht so gut aus.

Folgendes soll funktionieren:
Also früher konnte ich ein Bild mit dem Link Aufrufen:

```
http://bilder.***.de/service/bild.php/251,lastfm7CXK1.gif
```
Der neue Link lautet:

```
http://bilder.***.de/service/images.php?img=i251bpfv9q.gif
```
Was kann ich machen damit dies wieder funktioniert?


----------



## DripleX (29. Aug. 2013)

Ich habe mittlerweile eine richtige Subdomain bei mir angelegt: http: //bilder.***.de 
In dem Unterordner "service" liegt das Script. 

Ich habe nun mit einen anderen .htaccess to Nginx Übersetzer die Rewrite Regeln umwandeln lassen:

```
charset utf-8; 
rewrite ^/service/archiv.html$ /service/archiv.php; 
rewrite ^/service/bild/(.*)/(.*)$ /service/bild.php?bild=$1&bild_name=$2; 
rewrite ^/service/thumb/(.*)/(.*)$ /service/bild.php?tumbnail=2&bild=$1&bild_name=$2; 
rewrite ^/service/([a-z0-9\_\.]+).html$ /service/index.php?seite=$1 last; 
rewrite ^/service/profil-([0-9]+).html$ /service/index.php?seite=mitglieder.$1 last; 
rewrite ^/service/display-([a-z0-9]+).html$ /service/index.php?seite=display&img=$1 last; 
rewrite ^/service/display.([a-z0-9]+)-([a-z0-9]+).html$ /service/index.php?seite=display.$1&img=$2 last; 
rewrite ^/service/images-([a-z0-9]+).([a-z0-9]+)$ /service/images.php?img=$1; 
rewrite ^/service/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /service/images.php?img=$2/$1;
```
Aber leider scheinen diese auch nicht zu funktionieren?.
Weiß denn keiner eine Lösung?


----------



## magenbrot (30. Aug. 2013)

also erstmal würde ich die rewrites in einem "location /service { ... }" verpacken.

Dann aktiviere mal "rewrite_log on" und schau im error_log was denn da so bei deinen rewrites passiert. Vielleicht hilft das schon.


----------



## DripleX (30. Aug. 2013)

Danke für deine Antwort!
Leider funktioniert es trotzdem nicht.

Folgendes habe ich probiert:

```
charset utf-8;
rewrite_log on;
location /service {
rewrite ^/archiv.html$ /archiv.php;
rewrite ^/bild/(.*)/(.*)$ /bild.php?bild=$1&bild_name=$2;
rewrite ^/thumb/(.*)/(.*)$ /bild.php?tumbnail=2&bild=$1&bild_name=$2 ;
rewrite ^/([a-z0-9\_\.]+).html$ /index.php?seite=$1 last;
rewrite ^/profil-([0-9]+).html$ /index.php?seite=mitglieder.$1 last;
rewrite ^/display-([a-z0-9]+).html$ /index.php?seite=display&img=$1 last;
rewrite ^/display.([a-z0-9]+)-([a-z0-9]+).html$ /index.php?seite=display.$1&img=$2 last;
rewrite ^/images-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$1;
rewrite ^/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$2/$1;
}
```
Ich nehme mal an, dass dies die richtigen rewrite Regeln sind.

Und

```
charset utf-8;
rewrite_log on;
location /service {
rewrite ^/service/archiv.html$ /service/archiv.php;
rewrite ^/service/bild/(.*)/(.*)$ /service/bild.php?bild=$1&bild_name=$2;
rewrite ^/service/thumb/(.*)/(.*)$ /service/bild.php?tumbnail=2&bild=$1&bild_name=$2 ;
rewrite ^/service/([a-z0-9\_\.]+).html$ /service/index.php?seite=$1 last;
rewrite ^/service/profil-([0-9]+).html$ /service/index.php?seite=mitglieder.$1 last;
rewrite ^/service/display-([a-z0-9]+).html$ /service/index.php?seite=display&img=$1 last;
rewrite ^/service/display.([a-z0-9]+)-([a-z0-9]+).html$ /service/index.php?seite=display.$1&img=$2 last;
rewrite ^/service/images-([a-z0-9]+).([a-z0-9]+)$ /service/images.php?img=$1;
rewrite ^/service/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /service/images.php?img=$2/$1;
}
```
Bei beiden Variationen steht im error_log:

```
2013/08/30 15:45:02 [error] 29793#0: *1 open() "/var/www/bilder.xxx.de/web/service/bild.php/161,bmwsigpng6BBNL.png" failed (20: Not a directory), client: 178.27.xxx.xxx, server: bilder.xxx.de, request: "GET /service/bild.php/161,bmwsigpng6BBNL.png HTTP/1.1", host: "bilder.xxx.de"
2013/08/30 15:45:03 [error] 29793#0: *1 open() "/var/www/bilder.xxx.de/web/service/bild.php/161,bmwsigpng6BBNL.png" failed (20: Not a directory), client: 178.27.xxx.xxx, server: bilder.xxx.de, request: "GET /service/bild.php/161,bmwsigpng6BBNL.png HTTP/1.1", host: "bilder.xxx.de"
```
Ich habe auch nach jeder Änderung nginx und php5-fpm neu gestartet!

Es scheint so, als ob das "rewrite_log" nicht aktiviert ist.


----------



## DripleX (25. Sep. 2013)

Also noch mal ein bisschen von vorne:

Es soll die Url zb: 
	
	



```
http://bilder.xxx.de/service/bild.php/294,bmwsig0MY2P.jpg
```
in 
	
	



```
http://bilder.xxx.de/service/images.php?img=i303beh68u.jpg
```
Dafür gibt es folgende .htaccess Regel:

```
RewriteRule ^bild/(.*)/(.*)$ images.php?img=$1
```
Ich denke mal, das an dieser Regel auch schon etwas nicht stimmt.

Auf jeden Fall funktioniert die umgewandelte Funktion in nginx nicht:

```
rewrite ^/bild/(.*)/(.*)$ /images.php?img=$1;
```
Wahrscheinlich stimmt was mit dem "*" nicht... Die Regel wird einfach nicht ausgeführt!

Hier einmal die komplette site-enabled-***.vhost

```
server {
        listen *:80;


        server_name bilder.xxx.de www.bilder.xxx.de;

        root   /var/www/bilder.xxx.de/web;



        index index.html index.htm index.php index.cgi index.pl index.xhtml;


        location ~ \.shtml$ {
            ssi on;
        }


        error_page 400 /error/400.html;
        error_page 401 /error/401.html;
        error_page 403 /error/403.html;
        error_page 404 /error/404.html;
        error_page 405 /error/405.html;
        error_page 500 /error/500.html;
        error_page 502 /error/502.html;
        error_page 503 /error/503.html;
        recursive_error_pages on;
        location = /error/400.html {

            internal;
        }
        location = /error/401.html {

            internal;
        }
		location = /error/403.html {

            internal;
        }
        location = /error/404.html {

            internal;
        }
        location = /error/405.html {

            internal;
        }
        location = /error/500.html {

            internal;
        }
        location = /error/502.html {

            internal;
        }
        location = /error/503.html {

            internal;
        }

        error_log /var/log/ispconfig/httpd/bilder.xxx.de/error.log;
        access_log /var/log/ispconfig/httpd/bilder.xxx.de/access.log combined;

        location ~ /\. {
            deny all;
            access_log off;
            log_not_found off;
        }

        location = /favicon.ico {
			log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location /stats {

            index index.html index.php;
            auth_basic "Members Only";
            auth_basic_user_file /var/www/clients/client2/web18/web/stats/.htpasswd_stats;
        }

        location ^~ /awstats-icon {
            alias /usr/share/awstats/icon;
        }

        location ~ \.php$ {
            try_files /7454dffa8986bb7d9f10373de1ca23e1.htm @php;
        }

        location @php {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass 127.0.0.1:9027;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }

        location /cgi-bin/ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            root /var/www/clients/client2/web18;
            gzip off;
            fastcgi_pass  unix:/var/run/fcgiwrap.socket;
            fastcgi_index index.cgi;
            fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }



        charset utf-8;
        rewrite_log on;
        location /service {
        rewrite ^/archiv.html$ /archiv.php;
        rewrite ^/bild/(.*)/(.*)$ /images.php?img=$1;
        rewrite ^/thumb/(.*)/(.*)$ /bild.php?tumbnail=2&bild=$1&bild_name=$2;
        rewrite ^/([a-z0-9\_\.]+).html$ /index.php?seite=$1 last;
        rewrite ^/profil-([0-9]+).html$ /index.php?seite=mitglieder.$1 last;
        rewrite ^/display-([a-z0-9]+).html$ /index.php?seite=display&img=$1 last;
        rewrite ^/display.([a-z0-9]+)-([a-z0-9]+).html$ /index.php?seite=display.$1&img=$2 last;
        rewrite ^/images-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$1;
        rewrite ^/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$2/$1;
        }


}
```
Was habe ich falsch gemacht?


----------



## F4RR3LL (19. Nov. 2014)

Es ist zwar ein alter Beitrag, aber da ich grade selber Matpo auf einem nginx Server installieren musste, hier die richtige Nginx direktive, welche ich sonst auch nirgends im Netz finden konnte.
Einfach unter Optionen Nginx Direktiven folgendes einfügen, speichern, glücklich sein:


```
location / {
rewrite ^/([a-z0-9\_\.]+).html$ /index.php?seite=$1 last;
rewrite ^/profil-([0-9]+).html$ /index.php?seite=mitglieder.$1 last;
rewrite ^/display-([a-z0-9]+).html$ /index.php?seite=display&img=$1 last;
rewrite ^/display.([a-z0-9]+)-([a-z0-9]+).html$ /index.php?seite=display.$1&img=$2 last;
rewrite ^/images-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$1 ;
rewrite ^/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /images.php?img=$2/$1 ;
rewrite ^/faq-([a-z0-9\_\.]+).html$ /index.php?seite=faq&item=$1 last;
}
```
Gruß Sven


----------



## DripleX (19. Nov. 2014)

Danke für deine Antwort.
Leider funktioniert das bei mir auch nicht, da ich anscheinend eine so alte Version hatte, welche die Bilder mit der bild.php versehen hat.
Ein Beispiel: http://bilder.***.de/service/bild.php/294,bmwsig0MY2P.jpg


----------



## F4RR3LL (19. Nov. 2014)

Dann mal anders, welche Version haste denn? 
Damit habe ich es laufen. Eine bilder.php gibts bei mir auch nicht , wohl aber eine images.php.

```
MatPo Framework Version1.1.5
MatPo Images Hosting Script Version1.1.3
PHP Version5.4.35-0+deb7u2
Datenbank VersionMySQL 5.5.40-0+wheezy1
ServerLinux
Server Softwarenginx/1.2.1
```

Gruß Sven


----------



## DripleX (20. Nov. 2014)

Eine ältere als du. Ich hatte davor aber eine sehr alte Version. Dafür gab es dann einen "Importer"...

```
MatPo MIHS Version    1.0.13
MatPo Framework Version    1.0.15
PHP Version    5.4.35-0+deb7u2
Datenbank Version    MySQL 5.5.40-0+wheezy1
Server    Linux
Server Software    nginx/1.2.1
```
Updaten wird wahrscheinlich auch nicht gehen, da eben nur die alten Links von den alten Bildern nicht mehr gehen.
Hier meine aktuellen nginx Direktiven:

```
charset utf-8;
location /service {
rewrite ^/service/archiv.html$ /service/archiv.php ;
rewrite ^/service/bild/(.*)/(.*)$ /service/bild.php?bild=$1&bild_name=$2 ;
rewrite ^/service/thumb/(.*)/(.*)$ /service/bild.php?tumbnail=2&bild=$1&bild_name=$2 ;
rewrite ^/service/([a-z0-9\_\.]+).html$ /service/index.php?seite=$1 last;
rewrite ^/service/profil-([0-9]+).html$ /service/index.php?seite=mitglieder.$1 last;
rewrite ^/service/display-([a-z0-9]+).html$ /service/index.php?seite=display&img=$1 last;
rewrite ^/service/display.([a-z0-9]+)-([a-z0-9]+).html$ /service/index.php?seite=display.$1&img=$2 last;
rewrite ^/service/images-([a-z0-9]+).([a-z0-9]+)$ /service/images.php?img=$1 ;
rewrite ^/service/(thumb|ihsthumb)-([a-z0-9]+).([a-z0-9]+)$ /service/images.php?img=$2/$1 ;
}
```


----------

