Назад | Перейти на главную страницу

Как я могу создать в nginx место, которое будет работать с И без косой черты в конце?

Прямо сейчас у меня такой конфиг:

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)