¿Cómo encadenar reescrituras en Nginx?

¿Cómo encadenar reescrituras en Nginx?

Soy nuevo en el motor de reescritura de nginx. Estoy intentando convertir mi antiguo archivo htaccess al formato de nginx, pero tengo algunos problemas.

# ------------------------------------------------------ #
# 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]

Ese es mi archivo htaccess. Ahora esto es lo que tengo hasta ahora...

# ------------------------------------------------------ #
# 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;
}

La redirección index.php funciona bien, al igual que el nombre del "directorio" -> redirección del archivo php. Sin embargo, no sé cómo hacer varias cosas: implementar la corrección de la barra diagonal y redirigir externamente los archivos .php para no tener ningún archivo duplicado. Quiero que todas las páginas se vean limpias, como /help, /about, etc. Las páginas reales en el servidor tienen el formato /about.php. Además, no consigo que funcione la regla de reescritura de las imágenes. Quiero que cualquier cosa que no sea un archivo o directorio real (marca -e) y no un archivo reescribible (como/about) se redirija a generación/etc...

Respuesta1

Lo estás haciendo mal. A Nginx le encantan los bloques de ubicación, por ejemplo, redirigir /index.php a / lo harías.

location = /index.php {
    rewrite ^ http://domain.com/$args permanent;
}

También querrás consultar try_files. En general, si estás usando un if en Nginx, es probable que lo estés haciendo mal.

Recomiendo leer esto para obtener una introducción básica sobre cómo Nginx usa bloques de servidor y bloques de ubicación:http://blog.martinfjordvald.com/2010/07/nginx-primer/

información relacionada