У меня есть определенный шаблон 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 ;