nginx aliases and dynamic directory names

ⅰ亾dé卋堺 提交于 2019-12-11 04:26:45

问题


I have spent muy tiempo on this and I can't get a solution. I need a way to point the same url but with different root directory to the same application. I don't want to use rewrites because the root directoy name has to be processed by the application and rewrite discards it.

http://www.host.com/a/ --> /var/www/html/project/
http://www.host.com/b/ --> /var/www/html/project/
http://www.host.com/c/ --> /var/www/html/project/

I've managed to configure in nginx an alias directory with a fixed name vdirectory and make nginx forward the request to fastcgi.

location /vdirectory {

      alias /var/www/html/project/;
      try_files $uri $uri/ /vdirectory/index.php;
      location ~ \.php$ {
          fastcgi_pass unix:/var/run/php5-fpm.sock;
          include fastcgi_params;                       
          fastcgi_param SCRIPT_FILENAME $request_filename;
      }
}

The above works OK.

Since I don't want to use fixed root directory names but arbitrary ones, this is what I've managed so far:

location  ~ ^/(.?)$  {

      alias /var/www/html/project/;
      try_files $uri $uri/ /$1/index.php;
      location ~ \.php$ {
          fastcgi_pass unix:/var/run/php5-fpm.sock;
          include fastcgi_params;                       
          fastcgi_param SCRIPT_FILENAME $request_filename;
      }
}

Needless to say, it returns 404. It is a good sign because it means regex has recognized the path, but the request isn't forwarded correctly.

The only difference between the working config and the wrong one is /vdirectory vs ~ ^/(.?)$


回答1:


alias works differently when inside a regular expression location block. See this document for details. You will need to capture the remainder of the URI and append that to the alias value. For example:

location ~ ^/(?<prefix>[^/]+)/(?<name>.*)$ {
    alias /var/www/html/project/$name;

    if (!-e $request_filename) { rewrite ^ /$prefix/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;                       
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

I avoid using try_files and alias within the same block due to long term issues. See this caution on the use of if.



来源:https://stackoverflow.com/questions/45567260/nginx-aliases-and-dynamic-directory-names

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!