Nginx can handle the rewrite parameter differently, depending on the destination syntax.
Here are some examples how to define redirects and URL rewrites in nginx.
server {
server_name www.example.com;
root /var/www/www.example.com;
location / {
rewrite ^/$ http://websrv1.example.com/mypage redirect;
}
}
This will result in forwarding the browser to http://websrv1.example.com/mypage. The redirect address will be shown in the address bar.
Let's try this without a redirect or permanent option but with break or last:
server {
server_name www.example.com;
root /var/www/www.example.com;
location / {
rewrite ^/$ http://websrv1.example.com/mypage last;
}
}
Although the rewrite option is now set to last, the browser will still follow the URL and changes the URL in the address bar.
The reason for this is the http:// which is interpreted as external redirect.
So if you want to keep your domain and simply want to rewrite the URL (like in Apache with mod_rewrite), you must use a relative path:
server {
server_name www.example.com;
root /var/www/www.example.com;
location / {
rewrite ^/$ /mypage last;
}
}
This will load the website for www.example.com from the subfolder /mypage within the document root (/var/www/www.example.com).
But what if the destination website is loaded from somewhere else, for example from a Tomcat server in the background?
The following configuration covers this:
upstream tomcat {
server 127.0.0.1:8080;
}
server {
server_name www.example.com;
root /var/www/www.example.com;
location / {
include proxy-settings.conf;
proxy_pass http://tomcat;
rewrite ^/$ /mypage last;
}
}
First everything (location /) is passed to tomcat (the defined upstream server). Then the redirect for the root path (/) is happening and is relative to the path.
This results in keeping the browser's address URL at www.example.com but loads the website from 127.0.0.1:8080/mypage.
Claudio Kuenzler from Switzerland wrote on Jan 25th, 2021:
Markus, no, including a proxy settings file is not required. However you might want to use some proxy settings such as X-Forwarded-Proto or X-Forwarded-For headers. You can of course also write these settings (using proxy_set_header) or other settings (such as proxy_redirect) directly in the location context.
Markus Kugler from wrote on Jan 24th, 2021:
Thanks Claudio Kuenzler!
what is proxy-settings.conf for? Do I need it?
Claudio Kuenzler from Switzerland wrote on Jan 23rd, 2021:
Hi Markus! In this case you should redirect your root location to "/this/is/important/" and the path "/this/is/important/" is proxying to the external domain.
server {
server_name sub1.domain.com;
root /var/www/sub1.domain.com;
location / {
rewrite ^.* https://sub1.domain.com/this/is/important/ permanent;
}
location /this/is/important/ {
include proxy-settings.conf;
proxy_pass https://some-other-domain.com;
}
}
Markus from wrote on Jan 22nd, 2021:
Hi *
great tutorial thanks!
What if I want to rewrite from https://sub1.domain.com/ to physically https://some-other-domain.com/this/is/important/link.html but the browser should show https://sub1.domain.com/this/is/important/link.html
in other words some-other-domain.com needs to be hidden from the public AND url should be redirected from / to /this/is/important/link.html
thanks
Markus
ck from St. Gallen, Switzerland wrote on Apr 8th, 2015:
Hi U-lis. It worked fine in my testing environment but now I do not have access to this environment from back then anymore. But what is also possible is that your application itself (mypage) is automatically causing the redirect, not nginx. You can try with the setting "proxy_redirect off" and do the debugging with curl -v, following all the redirects manually to find out where the redirect happens.
U-lis from wrote on Mar 27th, 2015:
Hello, I have a question!
I tried your last server config to show example.com on address bar and load page from 127.0.0.1:8000/mypage.
But I got example.com/mypage on my addressbar with correct page I wanted.
Is Nginx config changed or my mistake?
I need your help. Thanks for your article.
== following is my nginx config, and I use python(gunicorn) webserver ==
upstream main { 127.0.0.1:8000 }
server {
listen 80;
server_name example.com;
location / {
include proxy_params;
proxy_pass http://main;
rewrite ^/$ /mypage last;
}
}
AWS Android Ansible Apache Apple Atlassian BSD Backup Bash Bluecoat CMS Chef Cloud Coding Consul Container Containers CouchDB DB DNS Database Databases Docker ELK Elasticsearch Filebeat FreeBSD Galera GlusterFS Grafana Graphics HAProxy HTML Hacks Hardware Icinga Icingaweb2 InfluxDB Internet Java KVM Kibana Kodi Kubernetes LTS LXC Linux Logstash Mac Macintosh Mail MariaDB Minio MongoDB Monitoring Multimedia MySQL NFS Nagios Network Nginx OSSEC OTRS Office PGSQL PHP Perl Personal PostgreSQL Postgres PowerDNS Proxmox Proxy Python Rancher SSL Samba Seafile Security Shell SmartOS Solaris Surveillance SystemD TLS Tomcat Ubuntu Unix VMWare VMware Varnish Virtualization Windows Wireless Wordpress Wyse ZFS Zoneminder