nginx配置文件重定向到子文件夹

时间:2013-03-23 17:33:21

标签: url-rewriting nginx subdomain

我目前正在尝试在两个目录中部署网站。尽管有很多文件,但我无法获得我希望的行为。这是网站的架构:

  • 主要网站页面存储在/opt/www/mainsite/index.html
  • 第二个网站(使用CodeIgniter)存储在/opt/www/apps/myapp/index.php

我希望配置nginx以获取此行为:

  • http中的所有请求必须重定向到https
  • www.mydomain.com必须指向/opt/www/mainsite/index.html
  • www.mydomain.com/myapp必须指向/opt/www/apps/myapp/index.php

目前,我的配置文件包含:

# redirect http to https
server {
    listen 80;
    rewrite ^(.*) https://$host$1 permanent;
}

# main webiste
server {
    listen 443;

    # ssl elements...  
    root   /opt/www/mainsite;
    index index.html;
    server_name             www.mydomain.com;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

在这个page上,我找到了为CodeIgniter设置配置文件的所有信息。但我不知道如何创建规则来指向CodeIgniter文件夹上的mydomain.com/myapp以及如何配置CodeIgniter以设置正确的配置。

有人可以帮助我吗?

提前致谢

2 个答案:

答案 0 :(得分:4)

  • 您需要http://wiki.nginx.org/HttpFastcgiModule来设置CodeIgniter。
  • 使用2个服务器块比使用if block进行重定向更好。见IF is Evil
  • 不要使用$ host,因为该变量值是从请求的HOST头中获取的,并且可以很容易地伪造。始终设置server_name指令并改为使用该名称。
  • 使用“return 301”指令比重写更好。节省cpu时间(正则表达式很慢)并且易于遵循。请注意,302重定向(重写...重定向)具有副作用,因为302会将所有POST请求转换为GET请求,这在您的情况下并不好。
  • 您不需要主站点中的try_files,因为主站点只提供静态文件。但您可以使用'expires'指令允许浏览器缓存静态文件。
server {
    listen 80;
    server_name www.mydomain.com;
    return 301 https://$server_name$request_uri;
 }

 server {
    listen 443;
    server_name www.mydomain.com;
    # ssl elements...  

    location / {
        root   /opt/www/mainsite;
        index index.html;
        expires max;
    }

    location /myapp {
        root /opt/www/apps/myapp;
        # fastcgi module goes here...
    }
}

答案 1 :(得分:0)

server {
    listen 80;
    listen 443 ssl;
    …
    if ($scheme != "https") {
        rewrite ^ https://$server_name$request_uri? redirect;
    }
    root /opt/www/mainsite/;
    location /myapp {
        root /opt/www/apps/myapp/;
    }
}

您可以在myapp location内添加myapp所需的任何配置。

顺便说一句,由于XSS问题,在一个Host内托管多个独立应用通常是一个坏主意。