添加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}}的登录页面。但现在它在添加重写块后抛出错误。重写有什么问题?谢谢你的帮助。
答案 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/signin
到www-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;
}