我有一个Apache2& Rails应用程序的乘客站点,使用以下配置:
<VirtualHost *:80>
ServerName localhost
DocumentRoot /var/www/site/public
<Directory /var/www/site/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
是否存在nginx&amp;客运站点?目前,nginx使用{ID}/action
响应404
格式的所有请求。这是nginx conf的相关部分:
location / {
passenger_app_root /var/www/site;
passenger_document_root /var/www/site/public;
passenger_enabled on;
try_files $uri $uri/ =404;
}
应用中没有.htaccess
个文件。
答案 0 :(得分:1)
此处为乘客作者。在Nginx中没有“AllowOverride all”的等价物,你也不需要它。您只需要一个虚拟主机块,其中“root”指向应用程序的“公共”目录,并且“passenger_enabled on”:
server {
listen 80;
server_name www.example.com;
root /var/www/site/public;
passenger_enabled on;
}
...正如the official Passenger documentation's deployment instructions所述。
passenger_app_root
会自动推断 passenger_document_root
和root
。由于Passenger automatically serves static files for you through Nginx。
try_files
答案 1 :(得分:0)
问题确实存在于try_files
中,只是删除该行解决了问题。稍微更好,更易读的解决方案是:
location / {
# nginx won't display 404, we leave this to Rails
try_files $uri @passenger;
}
location @passenger {
passenger_app_root /var/www/site;
passenger_document_root /var/www/site/public;
passenger_enabled on;
}
这是静态文件,无需向Passenger传递请求即可访问。
答案 2 :(得分:0)
接受的答案与乘客文件更相关。我偶然发现这个主题的主要原因是我希望将Allow Override
的{{1}}设置迁移到.htaccess
。
如果你不太了解nginx,你会认为(就像我做的那样)必须有一种方法可以为每个目录提供nginx.conf
,就像我们在的Apache。
但这不是nginx实现其设置系统的方式,原因在于结构方面他们更好地找到中央配置,而不是将设置分散在多个文件(.htaccess)上,这使得很难知道设置有效
因此,要从nginx.conf
文件迁移设置,必须将这些设置( nginx 的等效语法)复制到单个nginx.conf .htaccess
块。
参考链接:
https://www.nginx.com/blog/converting-apache-to-nginx-rewrite-rules/