How to Proxy Pass from / to /index.html - nginx

I'm currently working on a JS Project, that uses the url path. Now if I go on my website with example.com/, the JavaScript won't work, because I actually need example.com/index.html.
I'm already using an reverse proxy to proxy pass to two different docker containers. So my idea was to pass the request to example.com/index.html when example.com/ is called. But I can't figure out the regex stuff to achieve this goal.
My old config:
server {
listen 80;
server_name example.com;
# allow large uploads of files - refer to nginx documentation
client_max_body_size 1G;
# optimize downloading files larger than 1G - refer to nginx doc
before adjusting
#proxy_max_temp_file_size 2G;
location / {
proxy_pass http://structure.example:80;
}
location /cdn {
proxy_pass http://content.example:80;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Stuff I tried:
server {
listen 80;
server_name example.com;
# allow large uploads of files - refer to nginx documentation
client_max_body_size 1G;
# optimize downloading files larger than 1G - refer to nginx doc
before adjusting
#proxy_max_temp_file_size 2G;
location / {
proxy_pass http://structure.nocms:80/index.html;
}
location ~* \S+ {
proxy_pass http://structure.nocms:80;
}
location /cdn {
proxy_pass http://content.nocms:80;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

The accepted answer has one disadvantage: going to example.com explicitly redirects to example.com/index.html (that is, returns 301 Moved permanently), which is not always desired.
Instead, I suggest to prepend location / with another directive, location = /, which is designed to the root URL only:
location = / {
proxy_pass http://structure.nocms:80/index.html;
}
location / {
proxy_pass http://structure.nocms:80;
}
The above instructs nginx to pass requests to example.com directly to http://structure.nocms:80/index.html, while requesting any other URLs in example.com/* would pass the request to the corresponding URL in the downstream.

Below config should work for you
server {
listen 80;
server_name example.com;
# allow large uploads of files - refer to nginx documentation
client_max_body_size 1G;
# optimize downloading files larger than 1G - refer to nginx doc
before adjusting
#proxy_max_temp_file_size 2G;
location = / {
rewrite ^ /index.html permanent;
}
location / {
proxy_pass http://structure.example:80;
}
location /cdn {
proxy_pass http://content.example:80;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

Related

How to configure webhook in nginx?

I am trying to configure the nginx.conf file to receive webhook requests from an external website. The request gets failed with status code 405 (not allowed) when I try to call the webhook using postman. The path of the webhook is /hooks
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
# include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
# server_name _;
# root /usr/share/nginx/html;
server_name _;
root /etc/nginx/code/build;
location / {
try_files $uri /index.html;
}
error_log /var/log/nginx/jackfruit.error_log debug;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#include /etc/nginx/sites-enabled/*;
#location / {
#}
location /api {
proxy_pass http://localhost:8000;
}
location /hooks/ {
proxy_pass http://localhost:8000/hooks;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Try removing the trailing slash from the location block as such:
location /hooks {
proxy_pass http://localhost:8000/hooks;
}
The reason why I suspect this may be an issue:
If a location is defined by a prefix string that ends with the slash character, and requests are processed by one of proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, or memcached_pass, then in response to a request with URI equal to this string, but without the trailing slash, a permanent redirect with the code 301 will be returned to the requested URI with the slash appended.

Nginx reverse proxy to multiple sites on different locations

Is it possible to configure nginx reverse proxy where http://localhost/a/ leads to 1 site and http://localhost/b/ to another? I tried this config:
server {
listen 80;
server_name localhost;
location /a/ {
proxy_pass http://apache.org/;
}
location /b/ {
proxy_pass http://www.gnu.org/;
}
it almost works, but all the links returned by web pages are missing /a/ or /b/ prefix so it can't load any pictures, styles and etc. For example link http://localhost/css/styles.css is not working, but http://localhost/a/css/styles.css is working.
Is there a directive that will append all links on page with suitable prefix? Or there is different approach to put a websites on separate locations?
#ivan-shatsky, Thank you very much.
Just wanted to add working config if some1 else needs.
map $http_referer $prefix {
~https?://[^/]+/a/ a;
default b;
}
server {
listen 80;
server_name localhost;
location / {
try_files /dev/null #$prefix;
}
location /a/ {
proxy_pass http://apache.org/;
}
location #a {
proxy_pass http://apache.org;
}
location /b/ {
proxy_pass http://www.gnu.org/;
}
location #b {
proxy_pass http://www.gnu.org;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}```

switch off html wrapping of errors in nginx

I use nginx on Ubuntu to forward requests to a Spring Boot-driven API server. Sometimes the API returns a body with 4xx and 5xx errors, that the client application consumes. E.g. in the API code I might return:
{
"message": "blah"
}
However nginx seems to wrap errors up into some HTML and embeds the response within them. Is there any way to disable this behavior? And is there a way to do it en masse (i.e. for all 4xx and 5xx errors, without explicitly writing them all out with error_page for example)
Similar question and accepted answer here, however that seems to be a bit of hack. I'm sure there's a better way of doing this...
EDIT: Config looks like this:
server {
listen 80;
server_name my.domain.com;
location / {
proxy_pass http://127.0.0.1:9001;
}
}
You just need to add a error_page directive inside the location
server {
listen 80;
server_name my.domain.com;
location / {
error_page 404 = 404;
proxy_pass http://127.0.0.1:9001;
}
}
What this would do is cancel error_page from previous directives set at the http block. And pass the result back to the client as it is. You don't want the codes for which JSON should be sent back to the client in this error_page directive.
You can try update your nginx conf and add:
error_page 403 /error403.html;
location = /error403.html {
root html;
}
or for group of erros:
error_page 500 502 504 /50x.html;
location = /50x.html {
root html;
}
And here you can replace html files to json so nginx will return json respnse, like:
error_page 404 /404.json;
location = /404.json {
root html;
}
and don't forget put 404.json (and all appropriate files) into root which is specified in config.
In your config it will look like:
server {
listen 80;
server_name my.domain.com;
location / {
proxy_pass http://127.0.0.1:9001;
}
error_page 404 /404.json;
location = /404.json {
root html;
}
error_page 500 502 504 /50x.json;
location = /50x.json {
root html;
}
}

nginx index.html on all url

I would like to do like this
localhost/ | index.html
localhost/category | index.html
localhost/notes | index.html
localhost/notes/note1 | index.html
And I tried to do this but infinity mistakes stoped me.
When I'm trying to use localhost then I see it.
Rewrite or internal redirection cycle while processing "/index.html" - this error 500.
server {
listen 80;
server_name localhost;
root C:/Users/Sergey/Desktop/xxx/angular2do;
location / {
if ($request_method = POST) {
proxy_pass http://localhost:3000;
}
if ($request_method = GET) {
rewrite ^.*$ /index.html last;
}
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root html;
# }
}
I know stack has a lot of questions for this problem but I used to be all of them and always catched error.
Using rewrite ... last inside a location block will just cycle around rewriting /index.html to /index.html. You should use rewrite ... break instead. See this document for details.
If your application also requires resources (css, js, images), you may adopt an alternative approach that returns the static file if it exists, for example:
server {
listen 80;
root C:/Users/Sergey/Desktop/xxx/angular2do;
location / {
try_files $uri #other;
}
location #other {
if ($request_method != POST) { rewrite ^ /index.html last; }
proxy_pass http://localhost:3000;
}
}

Nginx error pages not working

I have the following vhost entry
server {
listen 80;
server_name example.com www.example.com;
#access_log /var/log/nginx/nginx-access.log;
location /media/ {
root /home/luke/django/solentcms;
}
location /admin/media/ {
root /home/luke/virts/django1.25/lib/python2.7/site-packages/django/contrib/admin/media;
}
location / {
proxy_pass http://127.0.0.1:8001;
}
error_page 404 /404.html;
location = /404.html {
root /home/luke/django/solentcms/404;
allow all;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/luke/django/solentcms/404;
allow all;
}
}
However, 404's and 50x errors are still be re-directed to the horrible nginx default pages.Any ideas as to why? This syntax works on one of my other servers.
Cheers.
Are the errors coming from your backend? You may need to add proxy_intercept_errors on; alongside your proxy_pass.

Resources