Como reescrever um URI no nginx?

1

Por favor, considere a seguinte estrutura de diretórios na minha raiz:

/resources/css
/resources/js
/resources/templates
/resources/images

Eu quero servir conteúdo estático dos diretórios acima, mas Eu também quero permitir que uma reescrita como essa funcione:

rewrite ^/([a-z]+)(.*)$    /index.php?p1=$1&p2=$2;

Por exemplo, myurl.com/register/... é reescrito para myurl.com/index.php?p1=register&p2=...

Mas essa regra também reescreve /resources/ , então, como eu excluo /resources da reescrita? Ou eu preciso de outra reescrita? Nada que eu tentei parece funcionar tão obviamente que não estou entendendo alguma coisa.

    
por amanda 19.09.2012 / 18:16

3 respostas

4

A configuração abaixo é o que eu achei que funciona, já que as declarações de localização são todos a mesma precedência são verificados em ordem.

Isso me ajudou a entender a precedência dos blocos de localização:

location =  <path>  (longest match wins)
location ^~ <path>  (longest match wins)
location ~  <path>  (first defined match wins)
location    <path>  (longest match wins)

Aqui está a configuração:

// match all css/js/images in resource path

location ~ ^/resources {
        root   /mypath/myurl.com;
        try_files $uri =404;
        break;
}

// allow myurl.com/register etc:

location ~  ^/([a-z]+)/(.*)$ {
        root   /mypath/myurl.com;
        rewrite ^/([a-z]+)(.*)$    /index.php?p1=$1&p2=$2;
}

// everything else:

location ~ / {
    root   /mypath/myurl.com;
    index  index.php;
}

Comentários bem-vindos!

    
por 20.09.2012 / 17:56
1

Você pode usar este exemplo:

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}

if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}

if ($request_method = POST ) {
  return 405;
}

if ($slow) {
  limit_rate  10k;
}

if ($invalid_referer) {
  return   403;
}

if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
}

Para mais informações, visite: link

    
por 03.10.2012 / 14:56
0

Você pode adicionar outro manipulador de local para aquele URI que corresponda a arquivos existentes - ou quebras, caso contrário.

location ~* /resources/(css|js|templates|images) {
  if (!-f $request_filename) {
    break;
  }
  root   /path/to/resources;
}

rewrite ^/([a-z]+)(.*)$    /index.php?p1=$1&p2=$2;
    
por 19.09.2012 / 18:52

Tags