
Ich bin neu bei der Rewrite-Engine von nginx. Ich versuche, meine alte htaccess-Datei in das Format von nginx zu konvertieren, aber ich stoße auf einige Probleme.
# ------------------------------------------------------ #
# This redirects index.php to / #
# ------------------------------------------------------ #
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(index|index\.php)\ HTTP/
RewriteRule ^(index|index\.php)$ http://domain.com/ [R=301,L]
# ------------------------------------------------------ #
# This rewrites 'directories' to their PHP files, #
# fixes trailing-slash issues, and redirects .php #
# to 'directory' to avoid duplicate content. #
# ------------------------------------------------------ #
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*)/$ http://twitstamp.com/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^.]+\.php\ HTTP/
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)\.php$ http://twitstamp.com/$1 [R=301,L]
# ------------------------------------------------------ #
# If it wasn't redirected previously and is not #
# a file on the server, rewrite to image #
# ------------------------------------------------------ #
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9_\-@#\ "'\+]+)/?([a-z0-9_\-]+)?(\.png|/)?$ generation/image.php?user=${escapemap:$1}&template=${escapemap:$2} [NC,L]
Das ist meine htaccess-Datei. Hier ist, was ich bisher habe ...
# ------------------------------------------------------ #
# This redirects index.php to / #
# ------------------------------------------------------ #
if ($request_uri ~* "^/index.php\??$") {
rewrite ^.*$ http://$host? permanent;
}
# ------------------------------------------------------ #
# This rewrites 'directories' to their PHP files, #
# fixes trailing-slash issues, and redirects .php #
# to 'directory' to avoid duplicate content. #
# ------------------------------------------------------ #
if (!-e $request_filename) {
rewrite ^(.*)$ $1.php;
last;
}
# ------------------------------------------------------ #
# If it wasn't redirected previously and is not #
# a file on the server, rewrite to image #
# ------------------------------------------------------ #
if (!-e $request_filename) {
rewrite ^([a-z0-9_\-@#\ "'\+]+)/?([a-z0-9_\-]+)?(\.png|/)?$ generation/image.php?user=$1&template=$2;
break;
}
Die Umleitung von index.php funktioniert einwandfrei, ebenso wie die Umleitung vom „Verzeichnis“-Namen -> PHP-Datei. Ich kann jedoch nicht herausfinden, wie ich mehrere Dinge tun soll: Implementieren des abschließenden Schrägstrichs und externe Umleitung von PHP-Dateien, damit ich keine doppelten Dateien habe. Ich möchte, dass alle Seiten sauber aussehen, wie /help, /about usw. Die echten Seiten auf dem Server haben das Format /about.php. Außerdem kann ich die Umschreibregel für die Bilder nicht zum Laufen bringen. Ich möchte, dass alles, was keine echte Datei oder kein echtes Verzeichnis (-e-Flag) und keine umschreibbare Datei (wie /about) ist, zu generation/etc. umgeleitet wird.
Antwort1
Sie gehen es falsch an. Nginx liebt Standortblöcke, zum Beispiel würden Sie /index.php nach / umleiten.
location = /index.php {
rewrite ^ http://domain.com/$args permanent;
}
Sie sollten sich auch try_files ansehen. Wenn Sie in Nginx ein if verwenden, machen Sie es wahrscheinlich falsch.
Ich empfehle die Lektüre dieses Artikels als grundlegende Einführung in die Verwendung von Serverblöcken und Standortblöcken durch Nginx:http://blog.martinfjordvald.com/2010/07/nginx-primer/