Why rewrite directive causes "301 Moved Permanently" with Nginx? - redirect

Below is a much simplified version of what I have in the configuration file of a server run by Nginx 1.2.5, yet it causes 301 Moved Permanently with Location: http://example.com/phpmyadmin/ before serving data, which is not what I expected from the default behavior of the rewrite directive.
server {
listen 80;
location /pma {
rewrite ^ /phpmyadmin;
}
location /phpmyadmin {
root /var/www;
index Documentation.html;
}
}
When I go to http://example.com/pma in a browser, the data is served but the URL in the address bar changes to http://example.com/phpmyadmin/ while it was supposed to stay http://example.com/pma.
How do I avoid Nginx sending 301 Moved Permanently so that it doesn't expose the actual directory structure on my server?

Try alias:
server {
listen 80;
location /pma {
alias /phpmyadmin;
}
location /phpmyadmin {
root /var/www;
index Documentation.html;
}

I think that you need to use alias instead of rewrite. Rewrite creates a "new" URL, so it makes a redirect
server {
listen 80;
location /pma {
alias /var/www/phpmyadmin;
index Documentation.html;
}
location /phpmyadmin {
root /var/www;
index Documentation.html;
}
}

Related

How to redirect requests to another host using ZAP?

I'm new to ZAP and I don't know much about it's js/ecma scripting.
Basically, I was trying to redirect request to another host.
Say an application that is connected to the ZAP proxy makes a request in a URL:
http://www.somesite.com/path/to/a/file
but I want to change the hostname in the URL to:
another.site.com
so it will actually request to: http://www.anothersite.com/path/to/a/file
Here's the code that I was trying to work but the URL remains unchanged in the request.
function proxyRequest(msg) {
// Debugging can be done using println like this
var uri = msg.getRequestHeader().getURI().toString()
var host = msg.getRequestHeader().getURI().getHost().toString()
print('proxyResponse called for url=' + uri)
if (host == 'download.qt.io') {
uri = uri.replace('download.qt.io/online/', 'mirrors.ocf.berkeley.edu/qt/online/')
msg.getRequestHeader().setHeader('Location', uri)
print('proxyRequest changed to url=' + uri)
}
if (host == 'ftp.jaist.ac.jp') {
uri = uri.replace('ftp.jaist.ac.jp/pub/qtproject/online/', 'mirrors.ocf.berkeley.edu/qt/online/')
msg.getRequestHeader().setHeader('Location', uri)
print('proxyRequest changed to url=' + uri)
}
if (host == 'qtproject.mirror.liquidtelecom.com') {
uri = uri.replace('qtproject.mirror.liquidtelecom.com/online/', 'mirrors.ocf.berkeley.edu/qt/online/')
msg.getRequestHeader().setHeader('Location', uri)
print('proxyRequest changed to url=' + uri)
}
return true
}
Option 1: Replacer Rule
Install the Replacer addon, from the marketplace:
Goto the Tools menu and select 'Replacer Options'.
Setup a rule as shown in the following screenshot.
Save/Okay as appropriate.
Now when your browse etc all your traffic will be redirected/rewritten.
Option 2: HttpSender Script
Create a new HttpSender script, similar to the following example:
function sendingRequest(msg, initiator, helper) {
var host = msg.getRequestHeader().getURI().getHost();
if (host.equals("www.somesite.com")) {
uri = msg.getRequestHeader().getURI();
uri.setEscapedAuthority("www.anothersite.com");
msg.getRequestHeader().setURI(uri);
}
return msg;
}
function responseReceived(msg, initiator, helper) {}
Option 3: Hosts File Entry
Goto a command prompt and nslookup www.somesite.com, note the IP address (w.x.y.z).
In your hosts file, add an entry associating the noted IP (w.x.y.z) with www.anothersite.com.
(You may need to restart ZAP/browsers for this change to take effect. On linux you'll likely need to sudo to edit the file, on Windows you'll need to edit it as an admin user.)
(Further details WRT editing your hosts file: https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/)

Prevent API URL from redirection. (Nginx - Website redirection)

I have to redirect users from website to mobile. I have added the following code for this -
set $mobile_rewrite do_not_perform;
## chi http_user_agent for mobile / smart phones ##
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
set $mobile_rewrite perform;
}
if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
set $mobile_rewrite perform;
}
## redirect to m-development.abc.com ##
if ( $mobile_rewrite = perform) {
rewrite ^ http://m-development.abc.com$request_uri? redirect;
break;
}
The problem is it redirects the API as well. In order to prevent this, I added the following code -
location ~* /api.*$/ { set $mobile_rewrite do_not_perform; }
Above the line ## redirect to m-development.abc.com ##
But this does not work.
Can someone suggest the modification required in this line?
I would recommend nested location and avoid the if statement.
Especially since
If Is Evil
Handle the redirect inside the location - there is an excellent explanation here nginx url rewriting: difference between break and last and use the Negated Regular Expressions in location.
Define your configuration file as such -
location ~ "/example*" { # location include the cases you want to redirect
location ~ "!?/api/*" {
#do regular opperation
}
#redirect the way you want
}
Good Luck!

NGINX Config: How to redirect array of URLs to home page

I would like an array of URLs, let's say ['/about','/supported-software', '/the-team', ...] to simply redirect to /.
Do I need to write multiple location { } blocks?
I'm new to NGINX configuration so any guidance would be very much appreciated!
If the array entries are exact matches, then the following locations should give you the best performance:
location = /about { return 301 $scheme://$host; }
location = /supported-software { return 301 $scheme://$host; }
location = /the-team { return 301 $scheme://$host; }
# ... or put these in an included file
If they are not exact matches, a map may be better:
map $uri $send_home {
~^/about/? 1;
~^/supported-software/? 1;
~^/the-team/? 1;
# ... or put these in an included file
}
server {
# ...
if ($send_home) {
return 301 $scheme://$host;
}
# ...
}
The map would allow more flexible redirects like:
/about
/about/
/about/stuff

Redirect rules with "+" in the string not working

I'm using Nginx and have setup some redirect rules in the .conf for the site, eg
if ($query_string ~ "Search=shelving"){ rewrite .*$ /shelving.html? redirect; }
So any url with "Search=shelving" will redirect to /shelving.html
This works fine, but I have other rules that have + in the string, which are not working eg
if ($query_string ~ "Search=metal+shelving"){ rewrite .*$ /shelving.html? redirect; }
this is not working, and I think that the + is breaking it, is there anyway around this?
Thanks
Edit:
An example of an url I'm look to redirect is:
https://example.com/SearchResults.aspx?Search=metal+shelving
to
https://example.com/shelving.html
You should just update your nginx rule like this
if ($query_string ~ "Search=metal\+shelving"){ rewrite .*$ /shelving.html? redirect; }
I would write something like this:
map $arg_search $redirect_url {
default "";
"metal shelving" /shelving.html;
"metal+shelving" /shelving.html;
"metal%2bshelving" /shelving.html;
"metal%2Bshelving" /shelving.html;
}
server {
...
if ($redirect_url) {
return 301 $redirect_url;
}
...
}
Just to cover all possible url encodings.

Set Nginx redirect rule priority

I have nginx+php-fpm and some rewrite rules for sef-urls.
The problem is that all my custom redirects/rewrites are ignored and request going to php script instead redirecting.
Part for sef-links:
if ($request_filename !~ ".(png|gif|ico|swf|jpe?g|js|css)$"){
set $rule_0 1$rule_0;
}
if (!-f $request_filename){
set $rule_0 2$rule_0;
}
if (!-d $request_filename){
set $rule_0 3$rule_0;
}
if ($rule_0 = "321"){
rewrite /. /index.php?sef_rewrite=1 last;
}
And I want to do that redirect:
location = /first.html {
return 301 /second.html;
}
You need to thing in terms of nginx's locations and rules. Then it will be much easier to write proper config. Try this one:
location / {
# replacement for last three `if`s
try_files $uri $uri/ /index.php?sef_rewrite=1;
}
# here is you redirect
location = /first.html {
return 301 /second.html;
}
# this is replacement for first `if`
location ~ \.(png|gif|ico|swf|jpe?g|js|css)$ {
# serve static files
}
# I'm sure you have this block somewhere
location ~ \.php$ {
# serve php
}
Also these articles worth to read them:
http://wiki.nginx.org/Pitfalls
http://wiki.nginx.org/IfIsEvil