Como encadear reescritas no Nginx?

Como encadear reescritas no Nginx?

Sou novo no mecanismo de reescrita do nginx. Estou tentando converter meu antigo arquivo htaccess para o formato nginx, mas estou tendo alguns 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]

Esse é o meu arquivo htaccess. Agora aqui está o que eu tenho até agora...

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

O redirecionamento index.php funciona bem, assim como o nome do "diretório" -> redirecionamento do arquivo php. No entanto, não consigo descobrir como fazer várias coisas: implementar a correção da barra final e redirecionar externamente os arquivos .php para que não haja arquivos duplicados. Quero que todas as páginas pareçam limpas, como/help,/about, etc. As páginas reais no servidor estão no formato/about.php. Além disso, não consigo fazer com que a regra de reescrita das imagens funcione. Eu quero que qualquer coisa que não seja um arquivo ou diretório real (sinalizador -e) e não um arquivo regravável (como/about) seja redirecionado para geração/etc...

Responder1

Você está fazendo isso errado. O Nginx adora blocos de localização, por exemplo, para redirecionar /index.php para / você faria.

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

Você também vai querer dar uma olhada em try_files. Em geral, se você estiver usando um if no Nginx, é provável que esteja fazendo errado.

Recomendo a leitura disto para uma introdução básica sobre como o Nginx usa blocos de servidor e blocos de localização:http://blog.martinfjordvald.com/2010/07/nginx-primer/

informação relacionada