У меня есть настройка nginx с такой структурой папок:
- www
|- splash
|- blog
www
это корневая папка.
Я хочу перенаправить пользователей, которые имеют доступ http://example.com
к splash
папка.
Но я не хочу, чтобы URL-адрес в адресной строке менялся на http://example.com/splash
.
URL-адрес в адресной строке по-прежнему должен быть http://example.com
.
Это правило должно применяться только тогда, когда пользователь обращается к корневой папке.
Тем временем доступ к blog
папка будет как обычно через: http://example.com/blog
.
Как мне этого добиться? Пока что мой conf следующий: (они не работают, кстати, URL-адрес изменен)
server {
listen 80;
server_name www.example.com;
root /www;
location = / {
rewrite ^/(.*)$ splash/$1 permanent;
}
}
У каждого контекста может быть свой корень.
Поскольку у вас есть location
контекст, просто измените корень.
Например.
location = / {
root /www/splash;
}
Документация имеется Вот. Пример, приведенный в документации:
location /i/ {
root /spool/w3;
}
Запрос на «/i/top.gif» вернет файл «/spool/w3/i/top.gif».
По сути, почти копия этого, за исключением того, что у вас есть =
для точного совпадения местоположения.
Если есть файл с именем / splash / blog, хотите ли вы, чтобы этот URL-адрес перешел в / splash / blog или / blog?
Другой способ расставить приоритеты для файлов - использовать try_files
. Например:
location / {
try_files /splash/$uri $uri =404;
}
В этом случае, если в / splash есть соответствующий файл, он будет отображаться, в противном случае вместо него отображается $ uri или, в последнем случае, ошибка 404.
Это сработало для меня, если я правильно понял вашу ситуацию:
location ~/splash.* {
return 200 "The request was $uri";
}
location / {
rewrite ^/$ /splash/ last;
root /usr/share/nginx/html;
index index.html index.htm;
}
last прекращает обработку текущего набора директив ngx_http_rewrite_module и начинает поиск нового местоположения, соответствующего измененному URI;
Я не хотел создавать каталог / splash /, поэтому просто сказал Nginx ответить жестко закодированным текстом. Вы можете заменить его необходимыми директивами.
Вот и все ...
server {
listen 80;
server_name www.mysite.com;
root /www;
location = / {
root /www/splash;
}
location / {
root /www;
}
}