RewriteRules aus .htacces in Nginx konvertieren

Alle installationsbezogenen Probleme hier posten. Dies sollte die erste Anlaufstelle bei Problemen sein.
Post Reply
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Hallo,
ich versuche mich gerade daran phpwcms mit rewrite auf einem Nginx Server zum laufen zu bekommen. Ich muss dazu sagen, Regex sind irgendwie nicht meins.

Folgendes habe ich versucht.
Der angeblich bequemste Weg http://winginx.com/en/htaccess
Nach einfügen von einem Leerzeichen nach ^ in der Original Rule

Code: Select all

RewriteEngine on
RewriteBase /
RewriteRule ^ (track|include|img|template|picture|filearchive|content|robots\.txt|favicon\.ico)($|/) - [L]
RewriteRule ^ index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.html$ /index.php?id=$1,$2,$3,$4,$5,$6&%{QUERY_STRING}
RewriteRule ^ (.+)\.html$ /index.php?$1&%{QUERY_STRING}
kam folgender Code raus

Code: Select all

location / {
	rewrite ^(.*)$ /(track|include|img|template|picture|filearchive|content|robots\.txt|favicon\.ico)($|/) - break;
	rewrite ^(.*)$ /index\.php$ - break;
	if (!-e $request_filename){
		rewrite ^(.*)$ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.html$ /index.php?id=$1,$2,$3,$4,$5,$6&$query_string;
	}
	rewrite ^(.*)$ /(.+)\.html$ /index.php?$1&$query_string;
}
Beim Test der config mit nginx -t dann der Fehler "invalid number of arguments in "rewrite".

Nach folgenden Änderungen

Code: Select all

location / {
	rewrite ^(.*)$ /(track|include|img|template|picture|filearchive|content|robots\.txt|favicon\.ico) break;
	rewrite ^(.*)$ /index\.php$ break;
	if (!-e $request_filename){
		rewrite ^(.*)$ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.html$ /index.php?id=$1,$2,$3,$4,$5,$6&$query_string;
		rewrite ^(.*)$ /(.+)\.html$ /index.php?$1&$query_string;
	}
}
kam dann folgende Meldung für die 2 rewrite Zeile beim Test "invalid variable name".

Die vielen Beispiele über die Google Suche haben mich auch nicht viel weiter gebracht.
Außer das man das rewrite auch noch anders machen kann http://wiki.nginx.org/Pitfalls#Front_Co ... d_packages

Code: Select all

location / {
	try_files $uri $uri/ index.php;
}
Dies endet in der Logfile Fehlermeldung

Code: Select all

2015/01/25 18:06:22 [error] 6327#0: *1 FastCGI sent in stderr: "PHP message: PHP Notice:  Use of undefined constant Y - assumed 'Y' in /data/www/vhosts/default/public_html/include/inc_front/front.func.inc.php(2287) : eval()'d code on line 1" while reading response header from upstream, client: .....
2015/01/25 18:07:15 [error] 6327#0: *1 FastCGI sent in stderr: "Unable to open primary script: /data/www/vhosts/default/public_htmlindex.php (No such file or directory)" while reading response header from upstream, client: .....
Bevor ich hier jetzt noch mehr Fehlermeldungen reinposte und es eher unübersichtlicher mache. Ich weis, das Hauptproblem ist, das ich nicht wirklich Ahnung habe, was die Regex wie tun.
Aber, hat jemand schon funktionierende Rules?

Es geht wirklich nur noch um die Rewrite Rules. Ordner/Dateien schützen, Fehlerseiten ausgeben etc. ist alles kein Problem und tut auch.

Grüße
Daniel
nameless1
Posts: 878
Joined: Sun 27. Apr 2008, 23:22

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by nameless1 »

ich denke für diese speziellen .htaccess fragen bist du in einem darauf spezialisierten forum besser aufgehoben.
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htaccess in Nginx konvertieren

Post by dani »

Ist das so speziell und nutzen wirklich alle phpwms nur auf Apache Servern?

Ok, Webhostingangebote haben nun mal Apache (manchmal dahinter auch Nginx), aber wenn man einen eigenen Server aufsetzt kommt dann als Alternative gleich Nginx (http://news.netcraft.com/archives/2015/ ... urvey.html). Microsoft IIS lass ich mal außen vor.
Nicht das es mir um Performance ginge, bei kleinen privaten Webseiten eher Nebensache. Für mich sieht der Nginx halt nach der schlankeren Lösung aus.

Vielleicht steigt ja doch noch einer in diese Diskussion mit ein, ansonsten mach ich hier halt einen Monolog.

Ganz auf dem falschen Weg schein ich mit den Rules wohl nicht zu sein, aber die front.func.inc.php(2287) erwartet wohl andere Variablen.

Code: Select all

PHP Notice:  Use of undefined constant Y - assumed 'Y' in /data/www/vhosts/default/public_html/include/inc_front/front.func.inc.php(2287) : eval()'d code on line 1"
Werde dann erstmal weiter forschen, bis die Tage.
Daniel
User avatar
juergen
Moderator
Posts: 4556
Joined: Mon 10. Jan 2005, 18:10
Location: Weinheim
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by juergen »

Du schreibst gerade auf so einer Kombi .... der phpmyadmin läuft (zB.) unter Nginx

Das kennst du ? http://nginx.org/en/docs/http/convertin ... rules.html
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Ja die Seite kenne ich.
Das redirect nehme ich für die Weiterleitung von http nach https. Sieht bei mir zur Zeit so aus und läuft.

Code: Select all

## HTTP Server
server {
	listen 80 default_server;
	server_name hometest.home.local;
	return 301 https://hometest.home.local$request_uri;
}

## HTTPS Server
server {
	listen 443;
	server_name hometest.home.local;
	root /data/www/vhosts/default/public_html;
	....
Auch das Wiki ist ja recht umfangreich http://wiki.nginx.org/Modules.

Mit statischen Weiter-/Umleitungen habe ich kein Problem, es geht ja um die dynamischen Strings. Was übergibt der Nginx wie an PHP und was erwartet PHP. Das Debug Log ist auch eher überfordernd.
Der unklare Teil ist

Code: Select all

index.php?id=$1,$2,$3,$4,$5,$6&$query_string;
und
/index.php?$1&$query_string;
Egal ob ich "rewrite" oder "try_files" verwende. Ich lande am Ende bei der Y Fehlermeldung (siehe letzter Post).
Die Beispiele http://nginx.org/en/docs/http/ngx_http_ ... #try_files wie man zum Ziel kommt scheinen vielfältig zu sein. Mit dem Einzeiler bekomme ich es nicht hin. Ich weis auch nicht ob mir die FastCGI Übergabe die Rewrites wieder zerhaut?

Code: Select all

	## PHP
	location ~ \.php$ {
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	}
Bei diesem Beispiel werden die Abfragen ja erst im FastCGI umgesetzt

Code: Select all

location / {
    try_files $uri $uri/ @drupal;
}

location ~ \.php$ {
    try_files $uri @drupal;

    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
    fastcgi_param QUERY_STRING    $args;

    ... other fastcgi_param's
}

location @drupal {
    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param QUERY_STRING    q=$uri&$args;

    ... other fastcgi_param's
}
Die Fragezeichen werden eher größer als kleiner :?
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Ist zwar einige Zeit ins Land gegangen, aber es wird langsam.

Zumindest funktioniert das Rewrite jetzt mit folgenden Regeln in der Nginx config.

Code: Select all

map $request_uri $bit_of_qs {
	default "";
	~/(?P<name>.*)\.html $name;
}
...
server {
...
location ^~ /config/phpwcms/	{ deny all; }
location ^~ /filearchive/	{ deny all; }
location ^~ /upload/	{ deny all; }
location ~ /\. { access_log off; log_not_found off; deny all; }
location / {
	try_files $uri @phpwcms;
}
location @phpwcms {
	fastcgi_pass unix:/var/run/php5-fpm/default.sock;
	include fastcgi_params;
	fastcgi_param SCRIPT_FILENAME $document_root/index.php;
	fastcgi_param QUERY_STRING $bit_of_qs&$query_string;
}
location ~* ^.+\.php$ { return 404; }
...
}
Bei dieser Konfiguration geht es rein um phpwcms. Alle anderen php Dateien werden ignoriert.
Wie ich zu diesen Regeln gekommen bin kann man hier http://forum.nginx.org/read.php?2,256693 lesen.

Aber vielleicht kann Oliver noch etwas zu folgendem sagen.
1. Braucht man die nachfolgende Rewrite Rule überhaupt noch? Es wird doch mittlerweile bei jedem Content ein Alias generiert

Code: Select all

RewriteRule ^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.html$ /index.php?id=$1,$2,$3,$4,$5,$6&%{QUERY_STRING}
2. Der Fehler "undefined constant Y"? Da stehe ich noch auf dem Schlauch.

Code: Select all

[error] 2798#0: *14 FastCGI sent in stderr: "PHP message: PHP Notice:  Use of undefined constant Y - assumed 'Y' in /xxx/xxx/xxx/xxx/public_html/include/inc_front/front.func.inc.php(2287) : eval()'d code on line 1" while reading response header from upstream, client: 192.x.x.x, server: hometest.home.local, request: "GET /home_de.html HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm/default.sock:", host: "hometest.home.local", referrer: "https://hometest.home.local/"
Das Rewrite funktioniert generell soweit ohne Probleme.
Daniel
Last edited by dani on Thu 19. Mar 2015, 21:53, edited 1 time in total.
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Um den "Y" FastCGI Fehler ist es immer noch schlecht bestellt.
Der ist immer noch fleissig bei jedem Seitenaufruf dabei.

Ich frage mich nur, wo ist in der Datei das Y in Zeile 1,

Code: Select all

...Use of undefined constant Y - assumed 'Y'.../front.func.inc.php(2287) : eval()'d code on line 1"
welches in dieser Funktion

Code: Select all

function include_int_phpcode($string) {
	// return the PHP code
	$s = html_despecialchars($string[1]);
	$s = str_replace('<br>', "\n", $s);
	$s = str_replace('<br />', "\n", $s);
	ob_start();
	eval($s.";");
	return ob_get_clean();
}
dieser Code

Code: Select all

eval($s.";");
interpretieren will?
Hat keiner ein Idee? (hoffen darf man ja, vielleicht liesst dies sogar Oliver)

Daniel
User avatar
Oliver Georgi
Site Admin
Posts: 9888
Joined: Fri 3. Oct 2003, 22:22
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by Oliver Georgi »

Es wird anscheinend innerhalb Deiner Installation fehlerhafter PHP-Code inkludiert. Dieser Code stammt NICHT! von phpwcms. Also ist das hier thematisch falsch. Prüfe also, welches [PHP] hier eingeladen wird und korrigiere den Code.
Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Hallo Oliver,
vielen Dank für den Hinweis.

Mir war nicht bewusst, das der Fehler auch vom eigentlichen CMS "Content" her kommen kann, da die Fehlermeldung ja nur auf die eine Zeile in der front.func.inc.php verwiesen hat.

Klar jetzt im Nachhinein habe ich es auch kappiert, das dies nur die Stelle ist wo Code/Inhalt, auch der aus simplen Contentparts, interpretiert wird.

Fehler ist gefunden. War dieses kleine PHP Schnipsel

Code: Select all

[PHP] echo date(Y);[/PHP]
Hochkommata rein

Code: Select all

[PHP] echo date('Y');[/PHP]
und der Fehler ist weg.

Den Apache hat es wohl all die Jahre nicht interessiert. Was der wohl noch so alles leger interpretiert?

Somit läuft es jetzt mit Nginx+FastCGI.

Daniel
User avatar
Oliver Georgi
Site Admin
Posts: 9888
Joined: Fri 3. Oct 2003, 22:22
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by Oliver Georgi »

Mit Apache hat das überhaupt nichts zu tun, sondern mit einer zu laxen PHP-Konfiguration verbunden mit nicht genügend getestetem Code. Ich persönlich empfehle seit Jahren, auf Inline PHP zu verzichten!
Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Ok, dann sollte ich meinen Content mal auf [PHP] RTs durchsuchen.
Gibt es noch weitere RTs, welche nicht mehr empfohlen sind?

Bei meinem letzten Update hat ja schon

Code: Select all

$phpwcms['enable_deprecated'] = false; 
für viel Spaß/Arbeit gesorgt. [PHP] viel da aber nicht drunter.

Zumindest scheint mein neuer Webserver dann wohl schon mal nicht so lax aufgesetzt zu sein! Der bisherige vom Webhoster verwendete Plesk. Da kann man als Kunde nicht viel prüfen, wenn die Logs nichts sagen.

Ist halt immer so eine Sache.
Der Content wurde vor xx Jahren mal angelegt, wo auch immer ich den "echo date (Y);" Code ohne Hochkommata in Web gefunden hatte, und dann immer nur per DB Dump oder Update weitergeschleppt. Vor xx Jahren war [PHP] halt in den Dokus als normales RT drin.

Aber hat man nicht auch ein CMS, um bei Änderungen so wenig wie möglich Content anfassen zu müssen?

Habe zumindest

Code: Select all

[PHP] echo date('Y');[/PHP]
jetzt durch

Code: Select all

{DATE:Y lang=EN}
ersetzt.
Hoffe das reißt nicht das nächste Loch ins System :wink:
User avatar
Oliver Georgi
Site Admin
Posts: 9888
Joined: Fri 3. Oct 2003, 22:22
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by Oliver Georgi »

Warum sollte das ein Loch reißen. Nicht alles vermischen, das eine hat teils mit dem anderen nichts zu tun. date(Y) war noch nie richtig. Plesk hat wiederum auch nichts mit den Einstellungen in Bezug auf PHP zu tun , gibt Dir aber die Möglichkeit, es nach Deinem Bedarf anzupassen. PHP ist von Haus aus heute sicherer eingestellt. Fehlermeldungen findest Du bei Plesk auch im Log-Ordner (wenn es konfiguriert ist). Üblicherweise schaltet man in Produktivumgebungen Fehlermeldungen ab, um nach außen nicht durch Zufall mögliche Schwachstellen zu offenbaren…

Und keine der alten Funktionen, die Du benutzt ist weg. Nur eben standardmäßig abgeschaltet, weil nicht mehr empfoheln (zum Teil). Wie bei PHP, wenn Du möchtest, lässt sich auch das wieder auf den toleranten Modus schalten.
Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
dani
Posts: 77
Joined: Sat 21. Jan 2006, 19:39
Location: Germany
Contact:

Re: RewriteRules aus .htacces in Nginx konvertieren

Post by dani »

Hallo Oliver,
erst nochmal Danke für die Antworten!
Ich glaube es würde hier jetzt zu weit weg vom ursprünglichen Thema der "RewriteRules" führen, über die weitere Nutzung von Funktionen zu reden. Würde dazu nochmal ein neues Thema starten.

Alle bei mir mit der Umstellung aufgetauchten Fehler sind soweit abgehandelt.

Rückwärts auf Plesk schaue ich jetzt nicht mehr, da dies beim Vorwärts nicht mehr mit dabei ist!
Ich hoffe die nächsten 9 Jahre (so lange nutze ich phpwcms nun auch schon!) nur einen Webserver verwenden zu müssen, welcher nur die wirklich nötigen Komponenten besitzt und da ist phpwcms zum Glück recht anspruchslos. Ich muss nicht einen Server aufsetzen, welcher alle möglichen Funktionen abbilden sollen/können muss.
Oliver Georgi wrote:Und keine der alten Funktionen, die Du benutzt ist weg. Nur eben standardmäßig abgeschaltet, weil nicht mehr empfoheln (zum Teil). Wie bei PHP, wenn Du möchtest, lässt sich auch das wieder auf den toleranten Modus schalten.
Darauf komme ich, wie gesagt, später noch mal zurück.
Denn PHP Code konnte ich ja in diesem Fall durch einen systemeigenen RT ersetzen.
Post Reply