Nginx'te AND ile ve sonunda eğik çizgiler olmadan çalışan bir yer nasıl oluşturabilirim?


46

Şu anda bu yapılandırma var:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

Bununla birlikte, eğer ziyaret edersem www.mysite.com/phpmyadmin(iz eğik çizgi olmamasını not edin), 404'ü aradığımı bulamaz. Sanırım izleyen eğik çizgiyi dahil etmediğim için. Bunu nasıl düzeltebilirim?


2
Bu sorunun oldukça eski olduğunu biliyorum, yine de kabul edilen cevabı değiştirme gereğini vurgulamak istiyorum. Deneyimsiz kullanıcılar (bu tür KG'leri arayacak olan kullanıcılar), şu anda kabul edilen yanıtı kullanarak güvenlik açıkları oluşturabilir.
Bozzy

Yanıtlar:


34

Kullanmakta olduğunuz düzenli ifadede olabilir -

location ~ ^/phpmyadmin/(.*)$

Yukarıdakiler / phpmyadmin /, / phpmyadmin / anything / else / here ile eşleşecektir, ancak düzenli ifade sondaki eğik çizgiyi içerdiğinden / phpmyadmin ile eşleşmeyecektir.

Muhtemelen böyle bir şey istersiniz:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

Soru işareti normal bir ifade niceleyicisidir ve nginx'e sıfır veya bir önceki karakterden (eğik çizgi) biriyle eşleşmesini bildirmelidir.

Uyarı: Topluluk, bu çözümü olduğu gibi, olası bir güvenlik riski olarak gördü.


Teşekkür ederim! Açıklama için de teşekkürler. Gelecekte kullanışlı olacak.
Rob,

15
Desen tam olarak doğru değil. Aynı zamanda "/ phpmyadmin1234" gibi bir yol ile eşleşebilir, tabii ki istediğin bu değil. @ kbec'in çözümü doğru olanıdır.
Miyav

3
Bunu açıkça aşağıya indirdiğim için üzgünüm, ama @Meow yorumunu ihmal etmenin önemli bir yolu var . Bu, güvenlik delikleri içerebilecek yanlış yapılandırılmış bir web sunucusuna yol açabilir.
Daniel F,

34

Daha iyi çözüm:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

Sunucunun /home/phpmyadminönce izinleri olduğundan emin olun .


Kabul edilen cevap ile farkın açıklanması:

Her şey normal ifadelerle ilgili .

Her şeyden önce, ^karakter ortada bir yerde değil, dize başında eşleştirmek istediğiniz anlamına gelir. $Dizenin sonuna kadar uygun uç vasıtası ile.

(?:)Aracı olmayan yakalayan grup - biz yakalama sonuçlarında istemiyoruz, ama biz basit gruba bazı karakter istiyorum. Bunu bu şekilde gruplandırıyoruz, çünkü /karakterin çocuk yolunun önemsiz bir parçası olmasını ve ana yolun önemli bir bölümünü olmamasını istiyoruz.


Neden daha iyi
Meekohi

2
@Meow bunu kabul edilen yanıtla yanıtladı
kbec

2
Bu kabul edilen cevap olmalıdır
Yonn Trimoreau

@Meekohi Bir açıklama yazdım
kbec

8

Neden kullanmıyorsun

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?


Çünkü bu benim için işe yaramadı. Buraya bakın: serverfault.com/questions/375602/…
Rob

1
@Rob aliasDirektife eğik çizgi olmadan denediniz mi ?
Shane Madden

Bu aslında doğru cevap ve bunu yapmanın doğru yoludur. Basitçe sondaki eğik çizgiyi dışlayın ve sondaki eğik çizgiyle birlikte olan ve olmayan URL'lerde çalışır. Nginx'te herhangi bir şeyi karmaşıklaştırmaya gerek yok, basit tutun, karmaşık regex ve diğer komik şeyler sadece Nginx'i yavaşlatacaktır.
MitchellK

4
Bununla ilgili sorun, aynı zamanda /phpmyadminblahblahblahblahya da başka bir kombinasyonla da eşleşecek olmasıdır
Gary Green

6

Bunun eski bir soru olduğunu biliyorum, ancak Google üzerinden buraya gelen herkes için, aşağıdaki yolu çözdüm (@ kbec'inki oldukça iyi).

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args
}

Bu, varyasyonları yakalar /foove /barbaşka bir url'ye (parametreler dahil) yönlendirir. Bunu bir proxy_passdirektifle gösteriyorum ama aynı zamanda işe yarayacaktı alias.

  • /foo -> /bar
  • /foo/ -> /bar/
  • /foo/sub -> /bar/sub
  • /foo/sub1/sub2/?param=value -> /bar/sub1/sub2/?param=value

Çalışır çünkü $1isteğe bağlı olarak alt kaynakları artı baştaki eğik çizgiyi yakalayacaktır, bu yüzden gibi şeyleri yakalamayacaktır /fooextra/. Aynı zamanda mevcut veya mevcut olmayan bir bitiş çizgisini uygun şekilde yönlendirir.


1
Proxy_pass kullanmak isteme ve dolayısıyla argümanları dikkate alma konusundaki temel durumu düşündüğünüz için teşekkür ederiz. Benim artı oyum var.
Daniel F

2

Bu yönlendirme, URL'leri yalnızca sondaki eğik çizgiyle olan ve olmayan yeniden yazacaktır. Eğik çizgiden sonra gelen hiçbir şeyin üzerine yazılmayacak.

domain.com/location => domain.com/new/location adresine yönlendirildi domain.com/location => domain.com/new/location
dizinine yönlendirildi
domain.com/location/other => yönlendirilmedi

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}


0

Ben böyle yaptım

rewrite ^/promo/?$     http://example.com/promo/page43902.html;
location /promo/ {
    root /var/www;
}

0

Neden sadece iki yeniden yazmadı:

location ~ ^/phpmyadmin
{
    rewrite /phpmyadmin /home/phpmyadmin/ break;
    rewrite /phpmyadmin/(.*) /home/phpmyadmin/$1 break;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.