nginx Como reescrever todos os URLs, exceto alguns com extensões especificadas?

1

Estou tentando converter rewrite rules de .htaccess files para nginx config. como parte da mudança do site para NGINX webserver.

aqui estão as regras de reescrita do .htaccess file

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.jp?g$
RewriteCond %{REQUEST_URI} !\.png$
RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.js$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} !\.xhtml$
RewriteCond %{REQUEST_URI} !\.htm$
RewriteCond %{REQUEST_URI} !\.ico$

RewriteRule (.*) index.php [L]
RewriteRule (.*).html index.php [L]

meu atual nginx config .

server {
    listen       80;
    server_name  example.com;

    root   /usr/share/nginx/html;

    location / {
        index  index.php index.html index.htm;
    }

    location ~ \.(php)$ {
        try_files $uri =404;
        root           /usr/share/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location !~* .(css|js|html|htm|xhtml|php|png|gif|ico|jpg|jpeg)$ {
      # Matches requests ending in png, gif, ico, jpg or jpeg. 
        rewrite ^(.*)$ /index.php break;
        rewrite (.*).html /index.php break;
    }

}

a home page está funcionando, mas os links internos do site estão dando 404.

até agora eu tentei muitas regras de reescrita como estas.

if ( $uri  ~ ^/(?!(\.css|\.js|\.html|\.htm|\.xhtml|\.php|\.png|\.gif|\.ico|\.jpg|\.jpeg))) { 
    rewrite ^/(.*)$ /index.php break;
}

mas, às vezes, o link interno funciona, enquanto redireciona todos os arquivos estáticos como .css, .js para a página inicial, e às vezes não consigo acessar /administrator/ do meu site, ele redireciona para a página inicial.

como posso replicar as regras de regravação .htaccess para nginx ?

    
por AMB 11.02.2017 / 14:18

1 resposta

2

Para mim, isso parece um padrão padrão de controlador frontal. No nginx, é implementado assim:

server {
    listen       80;
    server_name  example.com;

    root   /usr/share/nginx/html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.(php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

A lógica aqui é que primeiro tenta descobrir se o recurso solicitado existe como um arquivo ou um diretório. Se existir, será retornado ao cliente. Caso contrário, a solicitação é passada para o script PHP, que determina o conteúdo a ser retornado ao cliente.

    
por 11.02.2017 / 15:36