404’le sonuçlanacaksa, farklı bir URL’ye yeniden yazmaya çalışın


0

Yerel IIS örneğimi bir proxy olarak kullanmak için geliştirdiğim bir yerel tomcat sunucum var.

Bunu yapıyorum çünkü sunucuyu dağıtmak acı verici bir işlemdir çünkü içeriğin çoğu (tanımlayacağım gibi) kendi içeriğinde değildir. Farklı projelerden gelen içerikler esasen sunucunun kök dizinine kopyalanır. Yeniden yazma modülünün yardımıyla, URL'leri çoğunlukla sanal dizinlere yeniden yazabilmek için ayarlama zorluğuyla uğraşmak istemedim.

Örneğin.,

/js/* -> /someproject/js/*
/css/* -> /someproject/css/*
/**/*.pdf -> /someotherproject/pdf/*

Bununla birlikte, bu planın işe yaramadığı, özellikle hedef dizinlerde çakışma olduğunda birkaç köşe durumu vardır. Dağıtımda, bazı kaynaklar aynı dizine yerleştirilir, bu nedenle hangisinin hangisi olduğunu ayırt etmenin gerçek bir yolu yoktur. Bu dosyalar için kesin bir kalıp yok, hepsi karışık bir çanta.

Örneğin.,

/someproject1/file1.txt -> /file1.txt
/someproject2/book2.doc -> /book2.doc

Yani bir URL verildi /file1.txt, Gitmek için yeniden yazabilir miyim bilemem someproject1 veya someproject2. Bu yüzden, yeniden yazmaya çalışacak URL'lerin bir tür hiyerarşisi olsaydı bunun işe yarayacağını düşünüyorum. Böylece gibi bir url alabilir /file3.txt, geçerli görünen bu kalıpların ilkine yeniden yazma.

/someproject1/file3.txt     # if 404, try the next
/someproject2/file3.txt     # if 404, try the next
/someotherproject/file3.txt # if 404, try the next
/file3.txt                  # fallback

Bu sadece URL yeniden yazma modülü kullanılarak ifade edilebilecek bir şey mi?


Aynı dosyanın tüm ilgili proje dizinlerinde görünmesi için linkleri kullanmayı düşündünüz mü?
AFH

Belki, bunun senaryom için işe yarayıp yaramadığını bilmeme rağmen. Tek bir dizini birden fazla dizine yönlendirmenin bir yolu olsaydı, bunu yapardım. Ancak AFAIK, bu şekilde çalışmaz. Bu mümkün olsaydı, ben de kabul ederdim.
Jeff Mercado

IIS kullandığımdan beri çok eski ve artık bir test sürümüne sahip değilim, ancak kullandığım diğer web sunucuları gibi, birden çok bağlantıda herhangi bir kısıtlama olmadan herhangi bir dizine işaret edecek bir diğer ad tanımlanabileceğine inanıyorum. Aynı dizine. Aslında bunu büyük harfler için kullanıyorum. http://{Site}/music ve http://{Site}/Music ikisi de aynı şeyi gösteriyor {Drive}:\{Path}\SharedMusic.
AFH

Durumum için, diğer tarafa gitmem gerek. Tanımladığınız, yapabilirim, birden çok sanal yol tek bir fiziksel yola işaret edebilir. Fakat ideal olarak, tek bir sanal yol için birden fazla fiziksel yola ihtiyacım olacaktı. Bildiğim kadarıyla bu mümkün değil.
Jeff Mercado

O zaman yapabileceğiniz en iyi bağlantılar dizini oluşturmaktır: Bunu anında oluşturabilir ve işi düzenli aralıklarla çalışacak şekilde ayarlayabilirsiniz. Gibi bir komut kullanın. for /r %i in (*.*) do mklink /h "{CombinedPath}\%~nxi" "%i" (iki katına % bir toplu iş dosyasında). İlk önce temizlemek için ihtiyacınız olacak {CombinedPath} ile dizin del {CombinedPath}\*.*. Sembolik bağlantılar oluşturmayı deneyebilirsiniz (ihmal /h ), ancak IIS'nin bunları doğru şekilde kullanıp kullanmayacağından emin değilim.
AFH

Yanıtlar:


0

Bu çalışmayı başarabildim.

İlk engel, tüm şartlı eşleşme türlerinin küresel kapsamda mevcut olmadığının farkında değildi (kurallarımı yazdığım yerdeydi). Sadece Pattern mevcuttu. Bu alana erişmek için kapsamı "dağıtılmış" kapsamda (site başına kurallar) değiştirmek zorunda kaldım. IsFile ve IsDirectory eşleme türleri

O zamandan sonra, kurallarımı bir tür hiyerarşi ile yazabilirim. Önce, deseni eşleştirmek için yeniden yazma Önce denemek istiyorum, sonra bir dosyaya çözümlenmezse, bir sonraki desene yeniden yazın ve tekrarlayın.

<rule name="try in project/content" stopProcessing="false">
    <match url=".*" />
    <action type="Rewrite" url="project/content/{R:0}" />
</rule>
<rule name="verify project/content" stopProcessing="false">
    <match url="(project)/content(/.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}{R:2}" />
</rule>

Özel durumumda, önce belirli bir alt dizini denemek, daha sonra mevcut değilse üst dizinleri denemek istedim. Ancak, bunları hangi sırayla deneyeceğimi bildiğim sürece, bunu teorik olarak herhangi bir yol için yapabilirim.


Dolayısıyla sorudaki örneğim için şu kuralları koyardım:

<rule name="try in someproject1" stopProcessing="false">
    <match url=".*" />
    <action type="Rewrite" url="someproject1/{R:0}" />
</rule>
<rule name="try in someproject2 otherwise" stopProcessing="false">
    <match url="someproject1/(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="someproject2/{R:1}" />
</rule>
<rule name="try in someotherproject otherwise" stopProcessing="false">
    <match url="someproject2/(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="someotherproject/{R:1}" />
</rule>
<rule name="fallback to root otherwise" stopProcessing="false">
    <match url="someotherproject/(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}" />
</rule>
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.