1

添加后rewrite block,运行Rails 3.2.12应用的Ubuntu 12.04服务器404 Not Found进入时报错mysite.com/nbhy

这是一个指向nbhy下方的符号链接,它用于托管 Rails 应用程序。重写的目的是在用户输入时重写root /var/www//var/www/nbhyop/current/public/nbhy/authentify/sigin/nbhy or /nbhy/

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

 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是:

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"

在添加重写位置块之前,系统会弹出带有 url 的登录页面mysite.com/nbhy/authentify/signin。但现在它在添加重写块后抛出错误。重写有什么问题?

4

3 回答 3

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使用更具体的位置的答案是绝对正确的。但是使用 arewrite不是必需的,areturn更好,因为我们希望 nginx 中止执行并简单地——嗯——返回。

另请注意我如何将正则表达式包含在location / {}匹配所有位置的通用块中。这是根据Igor Sysoev编写位置块的正确方法。有关更多信息,请参阅此论坛帖子

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

我希望这有帮助!

相关链接

于 2013-06-17T06:35:54.730 回答
0

如果我理解正确,您有一个your-host/nbhy要重写的 URI your-host/nbhy/authentify/signin,应该链接到/var/www/nbhy/authentify/signin,符号链接到/var/www/nbhyop/current/public/authentify/signin?

看起来 nginx 正在抱怨找不到/var/www/nbhy/authentify/signin. /var/www/nbhy由于您有一个来自to的符号链接/var/www/nbhyop/current/public,因此必须有一个文件夹/var/www/nbhyop/current/public/authentify/signin。您确定有一个,并且您的www-data用户(或您正在使用的任何用户)有权访问它上面的目录吗?

此外,nginx 有一个禁用符号链接的选项。尝试将其设置为off. 我知道这是默认设置,但可能有另一个文件将其设置为on.

也可能是 nginx 没有遵循符号链接,因为您添加last了重写。尝试删除它,然后看看它是否有效。

于 2013-06-15T13:00:49.550 回答
-1

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

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

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

location /nbhy {
    rewrite ^ /nbhy/authentify/signin last;
}
于 2013-06-10T22:55:59.840 回答