Прямо сейчас у меня такой конфиг:
location ~ ^/phpmyadmin/(.*)$
{
alias /home/phpmyadmin/$1;
}
Однако, если я приду www.mysite.com/phpmyadmin
(обратите внимание на отсутствие косой черты в конце), он не найдет то, что я ищу для 404. Я предполагаю, потому что я не включаю косую черту в конце. Как я могу это исправить?
Лучшее решение:
location ~ ^/phpmyadmin(?:/(.*))?$ {
alias /home/phpmyadmin/$1;
}
Убедитесь, что у сервера есть разрешения на /home/phpmyadmin
первый.
Объяснение отличия от принятого ответа:
Это все о регулярные выражения.
Прежде всего, ^
char означает, что вы хотите найти соответствие с начала строки, а не где-то посередине. В $
в конце означает совпадение с концом строки.
В (?:)
означает группу без захвата - мы не хотим, чтобы она отображалась в результатах захвата, но мы хотим просто сгруппировать некоторые символы. Мы группируем это так, потому что хотим /
char, чтобы быть несущественной частью дочернего пути, а не значительной частью родительского пути.
Это может быть в регулярном выражении, которое вы используете -
location ~ ^/phpmyadmin/(.*)$
Вышеупомянутое будет соответствовать / phpmyadmin /, / phpmyadmin / something / else / здесь, но не будет соответствовать / phpmyadmin, потому что регулярное выражение включает в себя завершающую косую черту.
Вероятно, вам нужно что-то вроде этого:
location ~ /phpmyadmin/?(.*)$ {
alias /home/phpmyadmin/$1;
}
Знак вопроса является квантификатором регулярного выражения и должен указывать nginx на соответствие нулю или одному из предыдущих символов (косая черта).
Предупреждение: Сообщество восприняло это решение как возможную угрозу безопасности.
Почему бы тебе просто не использовать
location /phpmyadmin {
alias /home/phpmyadmin;
}
?
Я знаю, что это старый вопрос, но для всех, кто попадает сюда через Google, я решил его следующим образом (вариант @ kbec, что было неплохо):
location ~ ^/foo(/.*)?$ {
proxy_pass http://$backend$1$is_args$args
}
Это захватит любую вариацию /foo
и перенаправить на /bar
на другом URL (включая параметры). Я показываю это с proxy_pass
директива, но она также будет работать с alias
.
/foo
-> /bar
/foo/
-> /bar/
/foo/sub
-> /bar/sub
/foo/sub1/sub2/?param=value
-> /bar/sub1/sub2/?param=value
Это работает, потому что $1
при желании захватит подресурсы и начальную косую черту, поэтому не будет захватывать такие вещи, как /fooextra/
. Он также будет правильно перенаправлять присутствующую или отсутствующую конечную косую черту.
Это перенаправление будет только переписывать URL с косой чертой в конце и без нее. Все, что идет после косой черты, не будет перезаписано.
domain.com/location => перенаправлен на domain.com/new/location
domain.com/location => перенаправлен на domain.com/new/location
domain.com/location/other => не перенаправлен
server {
# 301 URL Redirect
rewrite ^/location/?$ /new/location permanent;
}
Вы пробовали использовать try_files
директива?
try_files $uri $uri/ =404;
Я сделал это так
rewrite ^/promo/?$ http://example.com/promo/page43902.html;
location /promo/ {
root /var/www;
}
Почему бы просто не поставить два рерайта:
location ~ ^/phpmyadmin
{
rewrite /phpmyadmin /home/phpmyadmin/ break;
rewrite /phpmyadmin/(.*) /home/phpmyadmin/$1 break;
}
Если вам также нужно proxy_pass
аргументы тоже лучше передавать:
location ~/phpmyadmin/?(.*)$ {
proxy_pass http://server/$1$is_args$args;
Тем не менее, мои личные предложения - НИКОГДА не использовать phpmyadmin
в производстве. Вы поймете, почему, проверив журналы доступа вашего общедоступного веб-сервера ... (множество ботов пытаются использовать phpmyadmin)