W tej chwili mam tę konfigurację:
location ~ ^/phpmyadmin/(.*)$
{
alias /home/phpmyadmin/$1;
}
Jednak jeśli odwiedzę www.mysite.com/phpmyadmin
(zauważ brak końcowego ukośnika), nie znajdzie tego, czego szukam 404. Zakładam, ponieważ nie uwzględniam ukośnika końcowego. Jak mogę to naprawić?
Odpowiedzi:
Może być w wyrażeniu regularnym, którego używasz -
Powyższe będzie pasowało / phpmyadmin /, / phpmyadmin / cokolwiek / else / tutaj, ale nie będzie pasowało / phpmyadmin, ponieważ wyrażenie regularne zawiera ukośnik końcowy.
Prawdopodobnie chcesz czegoś takiego:
Znak zapytania jest kwantyfikatorem wyrażeń regularnych i powinien powiedzieć nginx, aby dopasował zero lub jeden z poprzednich znaków (ukośnik).
źródło
Lepsze rozwiązanie:
Upewnij się, że serwer ma uprawnienia do
/home/phpmyadmin
pierwszego.Wyjaśnienie różnicy z zaakceptowaną odpowiedzią:
Chodzi o wyrażenia regularne .
Przede wszystkim
^
znak oznacza, że chcesz dopasować od początku łańcucha, a nie gdzieś pośrodku.$
Za pomocą końcowych pasujących do końca łańcucha.Te
(?:)
środki nie-robienia grupę - nie chcemy go w wynikach przechwytywania, ale chcemy prostej grupy niektórych znaków. Grupujemy to w ten sposób, ponieważ chcemy, aby/
char był nieistotną częścią ścieżki potomnej, a nie znaczącą częścią ścieżki nadrzędnej.źródło
Dlaczego po prostu nie używałbyś
?
źródło
alias
dyrektywie?/phpmyadminblahblahblahblah
dowolnej kombinacjiWiem, że to stare pytanie, ale dla każdego, kto trafi tutaj przez Google, rozwiązałem je w następujący sposób (odmiana @ kbec, co było całkiem dobre):
Spowoduje to przechwycenie dowolnej odmiany
/foo
i przekierowanie do/bar
innego adresu URL (w tym parametrów). Pokazuję to za pomocąproxy_pass
dyrektywy, ale to też zadziałaalias
./foo
->/bar
/foo/
->/bar/
/foo/sub
->/bar/sub
/foo/sub1/sub2/?param=value
->/bar/sub1/sub2/?param=value
Działa, ponieważ
$1
opcjonalnie przechwytuje dodatkowe zasoby i wiodący ukośnik, więc nie będzie przechwytywać takich rzeczy/fooextra/
. Przekieruje również odpowiednio obecny lub nieobecny ukośnik końcowy.źródło
To przekierowanie spowoduje przepisanie adresów URL tylko z ukośnikiem końcowym i bez niego. Wszystko, co nastąpi po ukośniku, nie zostanie zastąpione.
domain.com/location => przekierowano na domain.com/new/location
domain.com/location => przekierowano na domain.com/new/location
domain.com/location/other => nie przekierowano
źródło
Czy próbowałeś użyć
try_files
dyrektywy?źródło
Zrobiłem to w ten sposób
źródło
Dlaczego nie po prostu napisać dwa przepisania po prostu:
źródło