How can one properly handle Nginx routing with a dynamic ending? - nginx

More specifically, I have the static files of a React application in an Nginx container, and I want to serve those files at the route http://localhost/rooms/:id. The ID, is just an integer, and that integer determines the API call that the browser will make to the backend. I am having trouble telling Nginx to ignore the ID, and just serve the static files.
Here is my Nginx config file:
http {
include /etc/nginx/mime.types;
gzip on;
gzip_types text/plain text/css application/javascript;
server {
listen 80;
location /rooms/ {
root /var/www/rooms;
index index.html index.htm;
try_files $uri $uri/ =404;
}
location ~* \.(js|css)$ {
root /var/www/rooms;
expires 30d;
}
}
}
events { }
How can I tell Nginx to ignore everything after /rooms/?
The end result I would like is:
http://localhost/rooms/1 serves the static files in root
http://localhost/rooms/2 serves the same static files in root

It's best if you use different route for your api call, but if you really want to use it like this, just add the index file to try files. and you should also use root outside location block.
root /var/www/rooms;
location /rooms/ {
index index.html index.htm;
try_files $uri $uri/ index.html /index.html =404;
}

Related

nginx serve static index on root directory next to flask API

Trying to serve static files and an API in from the same servername.
I want to visitor to be directed to servername/index.html when they browse servername/
Currently servername/ is being processed by Flask instead.
Both API and static exist in the same dir.
nginx.conf:
server {
# path for static files
root /var/www/html;
location / {
# checks for static file, if not found proxy to app
index index.html;
try_files $uri #proxy_to_app; <--- gunicorn here
}
Adding $uri/ in try_files worked:
location / {
# checks for static file, if not found proxy to app
index index.html;
try_files $uri $uri/ #proxy_to_app;
}

Nginx - server static files

I'm trying to configure nginx to serve static files (images).
I would like to get images by this URL:
DOMAIN/images/RANDOM_FOLDER_NAME_123/RANDOM_FILE_NAME_456.png
On server I store images as:
/usr/share/nginx/html/RANDOM_FOLDER_NAME_123/IMAGES
/usr/share/nginx/html/RANDOM_FOLDER_NAME_234/IMAGES
/usr/share/nginx/html/RANDOM_FOLDER_NAME_345/IMAGES
/usr/share/nginx/html/RANDOM_FOLDER_NAME_456/IMAGES
I would like to match fe.
DOMAIN/images/RANDOM_FOLDER_NAME_123/RANDOM_FILE_NAME_456.png -> /usr/share/nginx/html/RANDOM_FOLDER_NAME_123/RANDOM_FILE_NAME_456.png
How have I set nginx path to achieve this? I tried to do this by:
location /images/ {
try_files $uri =404;
autoindex off;
}
But I think that problem is images in URL.
You can try
location /images {
alias /usr/share/nginx/html;
}
https://www.techcoil.com/blog/understanding-the-difference-between-the-root-and-alias-directives-in-nginx/

Location and document path in nginx

This is my nginx configuration file:
server {
listen 80;
server_name localhost;
location / {
root d:/www;
index index.html index.htm;
}
location /js/api/ {
root D:/workspace/javascript/maplib/;
autoindex on;
}
}
And the directory of the document is like this:
D:/workspace/javascript/maplib
-- v1.0
--main.js
-- v1.1
Now I want to access the v1.0/main.js by http://localhost/js/api/v1.0/main.js.
And it returns a 404 error.
It seems that ngnix will tried to get the file through D:/workspace/javascript/maplib/js/api/v1.0/main.js which does not exist.
It seems that the string path in the location(in the url) must exist at the file system.
How to fix it to meet my requirement?
BTW, there is not only the js but also some other kinds of files like .gif,.png,.html inside the D:/workspace/javascript/maplib/.
Use alias. Ref: http://nginx.org/en/docs/http/ngx_http_core_module.html#alias
That is, replace
root D:/workspace/javascript/maplib/;
by
alias D:/workspace/javascript/maplib/;
Use rewrite inside location /js/api/ for this, like:
rewrite ^/js/api(.*)$ $1;
You can use root with try_files, just add the try_files line
location /js/api/ {
root D:/workspace/javascript/maplib/;
autoindex on;
try_files $uri $uri/ =404;
}

Multiple Location For Static Location in Nginx Configuration

I have a two locations where my app will serve static files, one is /my/path/project/static and the other is /my/path/project/jsutils/static.
I'm having a hard time getting the webserver to look in both directories for static content. Here is my entry for static location in the nginx configuration file for my app.
location ^~ /static {
root /my/path/project/static;
alias /my/path/project/jsutils/static;
index index.html index.htm;
}
I get an error that says : "alias" directive is duplicate, "root" directive was specified earlier.
I'm not sure how to go about having nginx look in both these paths for static content.
Thank you in advance for any help.
location ^~ /static {
root /my/path/project/static;
index index.html index.htm;
try_files $uri $uri/ #secondStatic;
}
location #secondStatic {
root /my/path/project/jsutils/static;
}
So first the file will be searched in /my/path/project/static and if that could not be found there, the secondStatic location will be triggered where the root is changed to /my/path/project/jsutils/static.
You may use try_files (http://wiki.nginx.org/HttpCoreModule#try_files). Assuming that you static files are in /my/path/project/static and /my/path/project/jsutils/static. you can try this:
location ^~ /static {
root /my/path/project;
index index.html index.htm;
try_files $uri $uri/ /jsutils$uri /jsutils$uri/ =404;
}
Let me know if it works. Thanks!
Just implement your configuration in nginx language:
location /my/path/project/static {
try_files $uri =404;
}
location /my/path/project/jsutils/static {
try_files $uri =404;
}
I had the exact same problem and it looks like nginx doesn't like when root is overwritten by an alias. I fixed it by firstly removing the root declaration that was inside the server section and instead declared the root and alias appropriately directly in the location sections (note the commented out lines):
server {
# root /usr/share/nginx/html;
location /logs/ {
root /home/user/develop/app_test;
autoindex on;
}
location /logs2/ {
# root /home/user/branches/app_test;
alias /home/user/branches/app_test/logs/;
autoindex on;
}
}

Configure nginx with multiple locations with different root folders on subdomain

I'm looking to serve the root url of a subdomain and directory of a subdomain to two different folders on my server. Here is the simple set-up that I have and is not working...
server {
index index.html index.htm;
server_name test.example.com;
location / {
root /web/test.example.com/www;
}
location /static {
root /web/test.example.com/static;
}
}
In this example going to test.example.com/ would bring the index file in /web/test.example.com/www
and going to test.example.com/static would bring the index file in /web/test.example.com/static
You need to use the alias directive for location /static:
server {
index index.html;
server_name test.example.com;
root /web/test.example.com/www;
location /static/ {
alias /web/test.example.com/static/;
}
}
The nginx wiki explains the difference between root and alias better than I can:
Note that it may look similar to the root directive at first sight, but the document root doesn't change, just the file system path used for the request. The location part of the request is dropped in the request Nginx issues.
Note that root and alias handle trailing slashes differently.
The Location directive system is
Like you want to forward all request which start /static and your data present in /var/www/static
So a simple method is separated last folder from full path , that means
Full path : /var/www/static
Last Path : /static and First path : /var/www
location <lastPath> {
root <FirstPath>;
}
So lets see what you did mistake and what is your solutions
Your Mistake :
location /static {
root /web/test.example.com/static;
}
Your Solutions :
location /static {
root /web/test.example.com;
}
server {
index index.html index.htm;
server_name test.example.com;
location / {
root /web/test.example.com/www;
}
location /static {
root /web/test.example.com;
}
}
https://nginx.org/en/docs/http/ngx_http_core_module.html#root
A little more elaborate example.
Setup: You have a website at example.com and you have a web app at example.com/webapp
...
server {
listen 443 ssl;
server_name example.com;
root /usr/share/nginx/html/website_dir;
index index.html index.htm;
try_files $uri $uri/ /index.html;
location /webapp/ {
alias /usr/share/nginx/html/webapp_dir/;
index index.html index.htm;
try_files $uri $uri/ /webapp/index.html;
}
}
...
I've named webapp_dir and website_dir on purpose. If you have matching names and folders you can use the root directive.
This setup works and is tested with Docker.
NB!!! Be careful with the slashes. Put them exactly as in the example.
If you use this, I will suggest you set up this command too.
location /static/ {
proxy_set_header Host $host/static; // if you change the directory and the browser can't find your path
alias /web/test.example.com/static/;
}
If you want to check two different directories for the same URI use this config:
server {
...
root /var/www/my-site/public/;
...
index index.php index.html index.htm;
...
location / {
root /var/www/old-site/dist/;
try_files $uri $uri/ /index.php$is_args$args;
}
...
}
If Nginx couldn't find file in /var/www/old-site/dist/ directory, then it will try file in /var/www/my-site/public/ directory, but as we said to Nginx to try files with $uri $uri/ /index.php$is_args$args patterns, so Nginx will try /index.php$is_args$args in /var/www/my-site/public/ directory. not $uri
If you want to complete your fallthrough, then replace /index.php$is_args$args with /fallthrough$uri and then add the location /fallthrough { ... } with the alias key to your target directory.
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#root-inside-location-block

Resources