![调试 nginx URL 重写:如何找出问题所在?](https://linux22.com/image/546611/%E8%B0%83%E8%AF%95%20nginx%20URL%20%E9%87%8D%E5%86%99%EF%BC%9A%E5%A6%82%E4%BD%95%E6%89%BE%E5%87%BA%E9%97%AE%E9%A2%98%E6%89%80%E5%9C%A8%EF%BC%9F.png)
我在需要重定向到 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
等。它还会在会话中跟踪本地化,默认为美国,因此如果您刚刚请求,/news
Django 将重写为,/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 ;