Reputation: 10949
I'm using nginx 1.0.8 and I'm trying to redirect all visitors from www.mysite.com/dir to google search page http://www.google.com/search?q=dir where dir is a variable, however if dir=="blog"( www.mysite.com/blog) I just want to load the blog content(Wordpress).
Here is my config :
location / {
root html;
index index.html index.htm index.php;
}
location /blog {
root html;
index index.php;
try_files $uri $uri/ /blog/index.php;
}
location ~ ^/(.*)$ {
root html;
rewrite ^/(.*) http://www.google.com/search?q=$1 permanent;
}
if I do this even www.mysite.com/blog will be redirected to google search page. If I delete the last location www.mysite.com/blog works great.
From what I've read here: http://wiki.nginx.org/HttpCoreModule#location it seems that the priority will be first on regular expressions and that first regular expression that matches the query will stop the search.
Thanks
Upvotes: 24
Views: 46980
Reputation: 15110
location / {
rewrite ^/(.*)$ http://www.google.com/search?q=$1 permanent;
}
location /blog {
root html;
index index.php;
try_files $uri $uri/ /blog/index.php;
}
Explanation:
A location can be followed by a path string (called prefix string) or by a regex.
Regex starts with ~ (for case sensitive matching) or with ~* (for case-insensitive matching).
Prefix strings that starts with ^~ makes nginx ignore any potential regex matching (more about it below).
The nginx uses the following rule to determine which location to use (all matching is done against the normalized URI. See [1] for more details):
Regex that matches the URI (except if there is a prefix string that matches the URI and that prefix string starts with ^~). If there are multiple regex match, nginx uses the first match found as listed in the conf file.
Longest prefix string.
Here a few examples (obtained from [1]):
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
location = /
) which forces an exact match.Useful docs:
Upvotes: 30
Reputation: 733
This situation can also be handled using only regex. Though this is a very old question and it has been marked answered, I'm adding another solution.
If you use multiple loop forwards using reverse proxy this is the easiest way without having to add a separate location block for every directory.
root html;
index index.php;
location / { #Match all dir
try_files $uri $uri/ $uri/index.php;
}
location ~ /(?!blog|item2)(.*)$ { #Match all dir except those dir items skipped
rewrite ^/(.*) http://www.google.com/search?q=$1 permanent;
}
Upvotes: 0