Nginx重写抛出404 Not Found

时间:2013-06-10 20:19:55

标签: nginx rewrite

添加rewrite block后,托管rails 3.2.12 app的ubuntu 12.04服务器在输入404 Not Found时会抛出mysite.com/nbhy错误。 nbhy symlink下的root /var/www/指向/var/www/nbhyop/current/public/nbhy/authentify/sigin是托管rails app的/nbhy or /nbhy/。重写的目的是在用户输入 server { listen 80; server_name mysite.com; root /var/www/; passenger_enabled on; rails_env production; passenger_base_uri /nbhy; } location / { rewrite "/nbhy" /nbhy/authentify/signin last; rewrite "/nbhy/" /nbhy/authentify/signin last; } }

时重写为error.log

这是nginx.conf中的服务器块:

nginx

错误2013/06/09 21:36:31 [error] 32505#0: *1 open() "/var/www/nbhy/authentify/signin" failed (2: No such file or directory), client: 67.173.143.107, server: mysite.com, request: "GET /nbhy HTTP/1.1", host: "mysite.com" mysite.com/nbhy/authentify/signin为:

{{1}}

在添加重写位置块之前,系统可以调出带有网址{{1}}的登录页面。但现在它在添加重写块后抛出错误。重写有什么问题?谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

location块必须位于server块内:

server {
    listen                80;
    server_name           mysite.com;
    root                  /var/www/;
    passenger_enabled     on;
    rails_env             production;
    passenger_base_uri    /nbhy;

    location / {

        # Matches /nbhy /nbhy/ /nbhy////////////...
        location ~ ^/nbhy/*$ {
            return 301 /nbhy/authentify/signin;
        }

        # Other rules (regex) goes here
    }
}

在这个处理阶段,符号链接无关紧要。

您正在使用rewrite,第一个模式始终是正则表达式。 Mohammad AbuShady对于使用更具体位置的回答是完全正确的。但是使用rewrite不是必需的,return更好,因为我们希望nginx中止执行并简单地返回。

另请注意我如何将正则表达式括在匹配所有位置的通用块location / {}中。这是根据Igor Sysoev编写位置块的正确方法。有关详细信息,请参阅this forum post

我上面的配置也捕获带有多个斜杠的URL(因此为*),并且意味着更加用户友好的匹配,因为用户可能只是键入了太多的斜杠。无需惩罚他们,而是通过适当的重定向来回答。

我希望这有帮助!

相关链接

答案 1 :(得分:0)

如果我理解正确,您有一个URI your-host/nbhy,您要将其重写为your-host/nbhy/authentify/signin,该/var/www/nbhy/authentify/signin应与/var/www/nbhyop/current/public/authentify/signin相关联,/var/www/nbhy/authentify/signin符号链接到/var/www/nbhy

看起来nginx抱怨没有找到/var/www/nbhyop/current/public。由于您有/var/www/nbhyop/current/public/authentify/signinwww-data的符号链接,因此必须有一个文件夹off。您确定有一个,并且您的on用户(或您正在使用的任何用户)拥有上述目录的权限吗?

此外,nginx有an option用于禁用符号链接。尝试将其设置为last。我知道这是默认设置,但可能有另一个文件将其设置为{{1}}。

也许nginx不遵循符号链接,因为您在重写中添加了{{1}}。尝试删除它,然后查看它是否有效。

答案 2 :(得分:-1)

为什么不尝试添加更具体的位置块

location ~ /nbhy/?$ {
    rewrite ^ /nbhy/authentify/signin last;
}

或者您可以删除正则表达式,但它会匹配更长的网址,例如/nbhy/one/two

location /nbhy {
    rewrite ^ /nbhy/authentify/signin last;
}