调试 nginx URL 重写:如何找出问题所在?

调试 nginx URL 重写:如何找出问题所在?

我在需要重定向到 HTTPS 版本的网站上有一个特定的 URL 模式。这是一个 Django 网站;Nginx 会检查 memcached 中的每个 URL,如果找不到缓存版本,它会将请求代理到 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等。它还会在会话中跟踪本地化,默认为美国,因此如果您刚刚请求,/newsDjango 将重写为,/US/news除非用户有 cookie 表明他们正在使用不同的本地化。但是,Django 会处理这个问题,而不是 Nginx。)

答案1

nginx 的配置正则表达式对花括号很挑剔,但你可以使用它们如果你引用你的正则表达式......

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

应该管用。

答案2

重新启动后,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 ;

相关内容