如何将Apache的'AllowOverride all`转换为nginx

时间:2016-02-29 17:25:57

标签: apache nginx apache2 passenger

我有一个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个文件。

3 个答案:

答案 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_rootroot。由于Passenger automatically serves static files for you through Nginx

,因此无需try_files

您应该阅读the official documentation

答案 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/

https://www.digitalocean.com/community/tutorials/how-to-migrate-from-an-apache-web-server-to-nginx-on-an-ubuntu-vps