RewriteCond içindeki RewriteMap çalışmıyor (Apache)

Sep 29 2020

Doğru sürüm numarasını içerip içermediğini RewriteCondkontrol eden bir o var {QUERY_STRING}, eğer o zaman kullanıcıları doğru sürüme yönlendirmiyorsa.

Örneğin v0.7 en yeniyse, erişen kullanıcılar http://localhost/?v=0.5yönlendirilmelidir, http://localhost/?v=0.7ancak herhangi bir nedenle, RewriteMapkoşullarda kullanıyorsam , çalışmıyor ...

Bu çalışıyor

RewriteMap versions txt:/var/www/html/version.txt
RewriteCond "%{QUERY_STRING}" !^v=0.7
RewriteRule "^/$" "/?v=${versions:version}" [R,L]

Bu değil

RewriteMap versions txt:/var/www/html/version.txt
RewriteCond "%{QUERY_STRING}" !^v=${versions:version} RewriteRule "^/$" "/?v=${versions:version}" [R,L]

Version.txt içeriği

##
##  version.txt -- rewriting map
##  The version number written here will be mapped to the URL
##
##
version 0.7

Yanıtlar

2 MrWhite Sep 29 2020 at 18:37
RewriteCond "%{QUERY_STRING}" !^v=${versions:version}

Bu işe yaramaz çünkü CondPattern ( RewriteCondyönergenin 2. bağımsız değişkeni ) bir normal ifade olduğundan ve dolayısıyla değişken genişletmeyi desteklemez. (Eğer formunun geribaşvuruları kullanamaz gibi $nya %nveya sunucu değişkenleri %(SERVER_VAR}veya env değişkenler %{ENV:MY_ENV_VAR}vs.) It would aksi PCRE regex sözdizimi ile çatışma. Yalnızca TestString ( RewriteCondyönergenin ilk bağımsız değişkeni ) ve RewriteRule ikame bağımsız değişkenleri değişken genişletmeyi destekler, çünkü bu bağımsız değişkenler normal dizelerdir, düzenli ifade değildir.

Ancak yine de ihtiyacınız olanı yapabilir RewriteMapve sorgudan döndürülen doğru sürüm numarasının sorgu dizesinin başlangıcında olup olmadığını kontrol edebilirsiniz. Bunun yerine, sonucunu genişletmek RewriteMapiçinde testString (bu "sıradan" değil dize regex olduğundan destek değişken genişleme yapar) ve karşılaştırma iç geribaşvuru kullanarak bu.

Örneğin, RewriteCondokumak için değiştirin :

RewriteCond %{QUERY_STRING}@${versions:version} !^v=([\d.]+)(?:&[^@]*)?@\1

Değişken genişletmeden sonra, formun bir dizesini [email protected]normal ifadeyle eşleştiriyoruz ^v=([\d.]+)(?:&.*)?@\1. \1ilk yakalanan alt şablona yapılan dahili bir geri referanstır (yani, vURL parametresinin değeri ). Dolayısıyla bu, URL parametresi değeriyle öğesinden döndürülen değerle etkili bir şekilde eşleşir RewriteMap. Bütün bu ifade daha sonra bir reddedildiği ( !koşul ne zaman başarılı yüzden önek) değil eşleşmesi yani. sürüm numarası farklı.

([\d.]+)- Sorgu dizesindeki 1 veya daha fazla basamaktan veya değişmez noktadan oluşan sürüm numarasıyla eşleşir. Örneğin.0.5

(?:&.*)? - Varsa, sorgu dizesinin geri kalanıyla eşleşir.

@ başka türlü sorgu dizesinde veya "sürüm" dizesinde bulunmayan rastgele bir dizedir.

Boşluk içermedikleri sürece argümanları çift tırnak içine almanız gerekmez (bu durumda bile boşluklardan kaçabilirsiniz). Dolayısıyla, bu örnekte çift tırnak tamamen isteğe bağlıdır. Aynısı RewriteRuledirektif için de geçerlidir .