Konum yolunda Nginx joker karakter / regex


22

Sahip olduğum Nginx yapılandırma 404'ü şöyle fırlatıyor .php:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Ancak alt klasörde çalıştırmak istediğim bir index.php dosyası var. Geçerli yapılandırma şöyle:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

mükemmel çalışıyor, ancak sorun yinelenen konumlar ve çok sayıda alt sayfa varsa, config çok büyük hale geliyor.

* Gibi joker karakter ve nginx testinin geçtiğini ancak 404 sayfasını yüklemediğini belirten bazı regex denedim. Denedim:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Konumda regex veya joker karakter olarak bir yol adı alabilir miyim?

Yanıtlar:


32

=Maddedeki düzenleyici locationbloğunun herhangi joker karakterler önek eşleştirme veya normal ifadelerle olmadan, tam bir eşleşme olduğunu. Bu yüzden çalışmıyor.

Düzenli girişimi girişiminde, ve [a-z]arasındaki tek bir karakterle eşleşir . Bu yüzden sizin için çalışmıyor.az

Konumlarınızın aşağıdaki gibi ayarlanması gerekir. locationİfadelerin sırasına dikkat edin . nginx ilk eşleşen regex koşulunu seçer.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Burada büyük / küçük harfe duyarlı eşleme kullanıyorum ( ~bunun yerine değiştirici ~*). İlk durumda, yolun ilk kısmını, ardından bir veya daha fazla sayıda alfabetik / sayı karakterini ve ardından eşleştiriyorum index.php. Eşleşme aralığını değiştirebilirsiniz, ancak +"bir veya daha fazla" tekrar için hatırlayın .

İkincisi, biten herhangi bir URI ile eşleşiyor .php. Düzenli ifadelerin işe yarayacağından sürümünüzde fazladan karakterlere ihtiyacınız yoktur.


teşekkürler, evet ana şey tekrarı regex eksikti. +onu düzeltti.

1

Sipariş önemlidir, nginx'in "konum" tanımından :

Belirli bir istekle eşleşen konumu bulmak için nginx önce önek dizeleri (önek konumları) kullanılarak tanımlanan konumları kontrol eder. Bunların arasında en uzun eşleşen öneki sahip konum seçilir ve hatırlanır. Ardından, düzenli ifadeler yapılandırma dosyasındaki görünüm sırasına göre kontrol edilir. Normal ifadelerin araştırması ilk eşleşmede sona erer ve karşılık gelen yapılandırma kullanılır. Düzenli bir ifadeyle eşleşme bulunmazsa, daha önce hatırlanan önek konumunun yapılandırması kullanılır.

Anlamı:

  • İlk =. ("en uzun eşleşen önek" eşleşmesi)
  • O zaman örtük olanlar. ("en uzun eşleşen önek" eşleşmesi)
  • Sonra regex. (ilk maç)

Regex parçalarının sırasını ayarlamanız gerekir.

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.