Depuração nginx URL reescrita: Como descubro onde está o problema?

2

Eu tenho um padrão de URL específico em um site que precisa ser redirecionado para a versão HTTPS. Este é um site do Django; O Nginx verifica cada URL no memcached e, se não encontrar uma versão em cache, envia uma proxy para o Apache / mod_python para que o Django renderize a página.

O bloco de configuração relevante é

    rewrite ^/certificate              https://mysite.com/certificate ;
    rewrite ^/([a-zA-Z]{2})/certificate   https://mysite.com/certificate ;

... e parece que não está funcionando.

O Nginx é:

$ nginx -V
nginx version: nginx/0.7.65
built by gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
TLS SNI support disabled
configure arguments: --prefix=/usr/local/nginx --pid-path=/var/run/nginx.pid --with-http_gzip_static_module --with-http_ssl_module

Como posso descobrir se o problema é o fato de meus padrões não corresponderem ou um problema de configuração mais obscuro?

(O site está localizado em três idiomas, e a localização está na string do URL, por exemplo, /US/news/ , /DE/about , etc. Ele também localiza a localização na sessão, sendo padronizado como US. você acabou de pedir /news O Django irá reescrever para /US/news a menos que o usuário tenha um cookie indicando que está usando uma localização diferente. O Django lida com isso, não com o Nginx.

    
por pjmorse 16.04.2011 / 00:01

2 respostas

1

Em um reinício, o Nginx começou a gerar erros sobre essa linha de reescrita:

 [emerg]: directive "rewrite" is not terminated by ";" in /etc/nginx/sites-enabled/production:14

Isso me deu um pressentimento de que a sintaxe estava errada. Eu removi o {2} e o substitui por um + , que é um regex menos preciso, mas também mais compatível, e agora funciona. O regex corrigido é

 rewrite ^/([a-zA-Z]+)/certificate   https://mysite.com/$1/certificate ;
    
por 20.04.2011 / 23:21
4

O config regex do nginx é muito complicado com chaves, mas você pode usá-las se você citar sua regex ...

rewrite "^/([a-zA-Z]{2})/certificate"   https://mysite.com/$1/certificate ;

deve funcionar.

    
por 16.11.2011 / 10:29