14

I'm trying to redirect requests to https in nginx, unless it is of the form HOST/ANY_STRING_OF_CHARS/END_OF_URI, e.g.:

http://host.org/about # no redirect

http://host.org/users/sign_in # redirects to https://host.org/users/sign_in

This apparently works in Apache, but I don't understand how the bang works (ignore if it doesn't really work):

RewriteRule !/([a-z]+)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

How can I do this in a nginx rewrite rule? This is not working as I'd hoped:

rewrite !/([a-z]+)$ https://$server_name$request_uri redirect;

This doesn't do the redirect either, in case I had the logic backwards:

rewrite /([a-z]+)$ https://$server_name$request_uri redirect;

Help please?

1

2 Answers 2

30

Sends a permanent redirect to the client:

server {
  listen 80;
  rewrite ^(/users/\w+)$ https://$host$1 permanent;
  ...
}

for negative match you could use:

if ($request_uri !~ "^/users/\w+$")
{
  return 301 https://$host$request_uri;
}
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks for this. I'm looking for a negative match, i.e. no redirect for a specific pattern, redirect for everything else, not just requests with /users/ in it. Good call on permanent, I should be doing that.
I have added negative match for you.
Thank you! bonus points for a location block instead? I hear that's preferable to if, no?
You can't do negative match with location.
4
set $test "0";
if ($request_uri ~ "condition") {
   set $test "1";
}
if ($test ~ "0") {
   return 301 redirect url;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.