Nginx multiple roots
Solution 1
The configuration has the usual problem that generally happens with nginx. That is, using root
directive inside location
block.
Try using this configuration instead of your current location
blocks:
root /home/me/Documents/site1;
index index.html;
location /petproject {
alias /home/me/pet-Project/website;
}
This means that the default directory for your website is /home/me/Documents/site1
, and for /petproject
URI, the content is served from /home/me/pet-Project/website
directory.
Solution 2
You need the break
flag added to the rewrite rule, so that processing stops, and as this is inside a location block processing will continue inside that block:
rewrite ^/petproject/?(.*)$ /$1 break;
Note I also added /?
to the matching pattern so that you don't end up with double slashes at the beginning of the url.
Related videos on Youtube
Michael restore Monica Cellio
Interested in using research-level technology to make programming easier and better. Likes: Haskell, Ada. Favourite oxymoron: PHP software engineer.
Updated on September 18, 2022Comments
-
Michael restore Monica Cellio over 1 year
I'd like to divert off requests to a particular sub-directory, to another root location. How? My existing block is:
server { listen 80; server_name www.domain.com; location / { root /home/me/Documents/site1; index index.html; } location /petproject { root /home/me/pet-Project/website; index index.html; rewrite ^/petproject(.*)$ /$1; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
That is, http://www.domain.com should serve /home/me/Documents/site1/index.html whereas http://www.domain.com/petproject should serve /home/me/pet-Project/website/index.html -- it seems that nginx re-runs all the rules after the replacement, and http://www.domain.com/petproject just serves /home/me/Documents/site1/index.html .
-
Tero Kilkanen about 9 yearsThe rewriting isn't needed here at all when
alias
directive is used like it should be used here. -
dcsan almost 4 yearswhat is the usual problem you refer to and why is alias better? the nginx docs give an example using two roots
-
Tero Kilkanen almost 4 yearsThe usual problem is that people don't realize how
root
andlocation
blocks interact. Withroot
directive, nginx appends the path afterlocation
block to theroot
dir to get the full filesystem path to the file. Therefore, if the path specified inlocation
does not exist in the directory specified byroot
, something unexpected to the user happens.