Назад | Перейти на главную страницу

Отладка перезаписи URL в nginx: как понять, в чем проблема?

У меня есть определенный шаблон URL-адреса на сайте, который нужно перенаправить на версию HTTPS. Это сайт Django; Nginx проверяет каждый URL-адрес в memcached и, если не находит кешированную версию, передает запрос на Apache / mod_python, чтобы Django отобразил страницу.

Соответствующий блок конфигурации

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

... и, похоже, он вообще не работает.

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

Как я могу понять, проблема в том, что мои шаблоны не совпадают, или в более неясной проблеме конфигурации?

(Сайт локализован на три языка, и локализация находится в строке URL, например /US/news/, /DE/aboutи т. д. Он также отслеживает локализацию в сеансе, по умолчанию используется США, поэтому, если вы просто запросили /news Django перепишется на /US/news если у пользователя нет файла cookie, указывающего, что он использует другую локализацию. Однако этим занимается Django, а не Nginx.)

Регулярное выражение конфигурации nginx суетливо относится к фигурным скобкам, но вы можете их использовать если вы цитируете свое регулярное выражение ...

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

должно сработать.

При перезапуске Nginx начал выдавать ошибки в этой строке перезаписи:

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

Это дало мне понять, что синтаксис неправильный. Я удалил {2} и заменил его на +, которое является менее точным, но также более совместимым регулярным выражением, и теперь оно работает. Исправленное регулярное выражение

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