Nginx redirection for entire subfolder with screening for special characters - redirect

I have trouble making this work:
I need all links from
.domain.com/category/1
redirect to
*.domain.com/#something-{"[1]":"[]"}
.domain.com/category/2
redirect to
*.domain.com/#something-{"[2]":"[]"}
So I'm stuck on both making a regular expression and making proper screening for special characters:
So far did that:
server_name 1.domain.com 2.domain.com 3.domain.com;
location /^category/1$ {
return 301 /%23something-{"[1]":"[]"};
}
location /^category/2$ {
return 301 /%23something-{"[2]":"[]"};
}
And it doesn't work actually and takes some 10 lines, cause I have 10 categories.
And also I need to redirect /category/ itself to /

After endless tries I just installed a redirection plugin.

Related

Neatest way to redirect urls without trailing slash in HAproxy

What is the neatest way to redirect these
http://example.com/test to http://example.com/test/
(It should work no matter what "test" is). I'm new to HAProxy - I have different apache backends. Have it working for URLs of this format http://example.com/test/ but cannot get the other type to work.
Have tried:
(1)
http-request set-path %[path]/ unless { path_end / }
which doesn't load the html page properly - possibly because it's screwing up e.g. the referenced JS files.
(2)
http-request redirect code 301 prefix / drop-query append-slash if missing_slash
from the documentation. I figure I need some kind of slight adjustment to this but don't know where to start with it. Any hints would be much appreciated.
This would potentially best be done at the back-end, since only the back-end has a way to actually know which paths should be redirected. But, it should be possible from HAProxy.
It should work no matter what "test" is
I am skeptical that this is precisely what you need, because then (e.g.) /css/common.css becomes /css/common.css/, which would be wrong.
I'm inclined to think you want something like this:
http-request redirect code 301 prefix / drop-query append-slash if { path_reg /[^/\.]+$ }
Redirect to the same path, with the query removed and / appended to the end, if the path ends with a / followed by at least 1 (or more) characters that is neither / nor ..
This should redirect /test to /test/ and /hello/world to /hello/world/ but it should leave paths like /js/example.js and /images/cat.png and /favicon.ico unaffected.
Deeper nesting should work correctly, too, because regular expressions like this either find a match or don't, and this expression only considers whatever is after the final slash in the path. If it contains a dot or nothing, then there is no match, which seems correct.

Redirect ALL get parameters to another domain in Nginx

Only answers I can find for this have specific parameters and don't work if the parameters change.
I have a URL coming in such as:
/logs.php?user_id=10032&account_id=10099&message=0&interval=1&online=1&rsid=65374826&action=update&ids=827,9210,82930&session_id=1211546313-1602275138
I need to redirect this url to a completely different domain and file but keep the get params.
So it ends up redirecting to:
https://example.com/the_logger.php?REPEAT_ALL_GET_PARAMETERS_HERE
Here is what I have unsuccessfully tried so far:
location logs.php
{
rewrite https://example.com/the_logger.php?$args last;
}
But it doesn't seem to match the url or redirect. I think I'm misunderstanding the logic of nginx confs. If it were .htaccess I think I'd be okay. I can put a few more examples here if need be of what I'm trying to achieve.
As you state this is a redirect and not reverse proxying a request, I would use the return directive to tell the client to do a 301 or 302. Using the return directive is the simpler and more recommend approach to redirecting a client.
Something like should do what you want:
location /logs {
return 302 https://example.com/the_logger.php$is_args$args;
}
Where $is_args would output a ? if and only if the query string is not empty, and $args is the query string itself

nginx redirect based on domain and amend the url

i have several server names as in www.example.com example.com www.example.de example.de. If there is no arguments I would like to amend the language to the URL
for example
www.example.com ---> www.example.com?language=en
example.de ---> example.de?language=de
regrads
You can test for the absence of arguments by comparing $args with an empty string. For example:
if ($args = "") {
return 301 $scheme://$host$request_uri?language=en;
}
If you have your domains implemented within different server blocks, you can customise the return statement appropriately.
If you need to implement all of this within a single server block supporting multiple host names, you may need to use a map directive to calculate the value of the language parameter. See this document for more.
This is not a perfect solution, as the edge condition www.example.com? will result in www.example.com??language=en which does not look nice.

How to make a redirect to nginx, depending on the part of the URL?

Welcome essence of the problem.
We have a path
site.com/seveniry-dlya-turistov/...
(Where ... is the character code specific record (of goods), and in front of it, as you might guess - section of this article)
Those show on site.com website under "souvenirs for tourists" page of a souvenir.
I need to redirect this type:
If there is a request to .../eveniry-dlya-turistov/.. substitute the section title in the name of .../seveniry/..., see if there is a request for
site.com/seveniry-dlya-turistov/elemnet1/
we have to do a 301 redirect to
site.com/seveniry/elemnet1/
Please tell me how to do it, and why does not work like that ...
location /catalog {
rewrite ^/catalog/souvernirs-for-tourists/(.*)$ http://SITE-NAME/suveniry/$1 permanent;
}
Thanks in advance for your help!
Should be something like
rewrite ^/seveniry-dlya-turistov/(.*)$ /seveniry/$1 last;
But you need to test the exact regex since it's hard to do by head without testing. nginx will look for another location block matching /seveniry/$1 to serve content.

How do I used the map feature in haproxy to build massive redirect tables 1.5

I think the subject covers it. I need to build a list of many 301 redirects within the same domain i.e. redirect /some_old_place to /some_new_place. We have lots of content the gets retired or replaced based on uri. The quote from the current home page of haproxy states maps may be used to "build massive redirect tables" but for the life of me I can figure it out. I am using version 1.5 and here are the lines of the config which I am currently am working on.
redirect location %[map(/opt/local/etc/haproxy/redirect.map), hdr(url)] code 301
Given the above config line I get
[ALERT] 099/205518 (27981) : parsing [/opt/local/etc/haproxy/haproxy.cfg:83] : error detected in frontend 'LoadBalancer' while parsing redirect rule : expects 'code', 'prefix', 'location', 'scheme', 'set-cookie', 'clear-cookie', 'drop-query' or 'append-slash' (was 'hdr(url)]').
I have tried many variations of this but have not found any success. If anyone knows how to do this please let me know?
This was the solution I came up with. Thanks JStarcher for the tip about spaces.
http-request redirect location %[capture.req.uri,map(/etc/haproxy/redirect.map)] code 301 if { capture.req.uri,map(/etc/haproxy/redirect.map) -m found }
In the referenced file redirect.map I have a source uri on the left and a destination separated by a space on the right.
/some_old_page.html /some_new_page.html
I have over 2k lines in the file at this point and I have seen no noticeable slowdown.
You have to use the http-request redirect directive which supports log-format strings.
Another little tricky gotcha, you can't have a space after the comma.
Try this:
http-request redirect location %[hdr(host),map(/opt/local/etc/haproxy/redirect.map)] code 301