ASP.NET Core'de URL Yeniden Yazma Ara Yazılımı

Mikael Mengistu tarafından

Bu belgede, url yeniden yazma ve uygulamalarda URL Yeniden Yazma Ara Yazılımı'nın nasıl ASP.NET Core tanıtılabilir.

URL yeniden yazma, önceden tanımlanmış bir veya daha fazla kurala göre istek URL'lerini değiştirme eylemidir. URL yeniden yazma, kaynak konumları ile adresleri arasında bir soyutlama oluşturur, böylece konumlar ve adresler sıkı bir şekilde bağlantılı değildir. URL yeniden yazma, çeşitli senaryolarda şunları yapmak için değerlidir:

  • Sunucu kaynaklarını geçici veya kalıcı olarak taşıma veya değiştirme ve bu kaynaklar için kararlı bulucuları koruma.
  • İstek işlemeyi farklı uygulamalar arasında veya bir uygulamanın farklı alanlarına bölme.
  • Gelen isteklerde URL kesimlerini kaldırın, ekleyin veya yeniden düzenleme.
  • Arama Motoru İyileştirmesi (SEO) için genel URL'leri iyileştirme.
  • Ziyaretçilere kaynak isteğiyle döndürülen içeriği tahmin etmeye yardımcı olmak için kolay genel URL'lerin kullanımına izin verme.
  • Güvenli olmayan istekleri güvenli uç noktalara yeniden yönlendirin.
  • Dış sitenin başka bir sitede barındırılan statik varlığı kendi içeriğine bağlayacak şekilde kullandığı hotlinking'i önle.

Not

URL yeniden yazma, uygulamanın performansını düşürebilir. Uygunsa kuralların sayısını ve karmaşıklığını sınırla.

Örnek kodu görüntüleme veya indirme ( nasılindir)

URL yeniden yönlendirme ve URL yeniden yazma

URL yeniden yönlendirme ile URL yeniden yazma arasındaki ifade farkı belirsizdir, ancak istemcilere kaynak sağlama konusunda önemli etkileri vardır. ASP.NET Core URL Yeniden Yazma Ara Yazılımı her iki ihtiyacı da karşılar.

URL yeniden yönlendirmesi, istemcinin başlangıçta istenenden farklı bir adresteki bir kaynağa erişmesi istenen bir istemci tarafı işlemi içerir. Bunun için sunucuya gidiş dönüş gerekir. İstemciye döndürülen yeniden yönlendirme URL'si, istemci kaynak için yeni bir istekte olduğunda tarayıcının adres çubuğunda görünür.

, 'a yeniden yönlendirilmesi durumunda sunucu, yeniden yönlendirmenin geçici veya kalıcı olduğunu belirten bir durum koduyla istemcinin kaynağı /resource /different-resource /different-resource alması gerektiğine yanıt verir.

Sunucu üzerinde bir WebAPI hizmet uç noktası geçici olarak sürüm 1'den (v1) sürüm 2'ye (v2) değiştirildi. İstemci, hizmete /v1/api sürüm 1 yolundan bir istekte bulundu. Sunucu, hizmet için yeni, geçici yolu 2 /v2/api sürümünde olan 302 (Bulundu) yanıtını geri gönderir. İstemci, yeniden yönlendirme URL'sini kullanarak hizmete ikinci bir istek yapar. Sunucu 200 (Tamam) durum koduyla yanıt verir.

İstekleri farklı bir URL'ye yeniden yönlendirerek, yanıtla birlikte durum kodunu belirterek yeniden yönlendirmenin kalıcı mı yoksa geçici mi olduğunu belirtin:

  • 301 - Taşınan Kalıcı durum kodu, kaynağın yeni, kalıcı bir URL'ye sahip olduğu yerde kullanılır ve istemciye gelecekte kaynakla ilgili tüm isteklerin yeni URL'yi kullanması gerektiğini belirtirsiniz. İstemci, 301 durum kodu alınca yanıtı önbelleğe almış ve yeniden kullanabilir.

  • 302 - Yeniden yönlendirmenin geçici olduğu veya genellikle değişebilir olduğu durum kodu kullanılır. 302 durum kodu istemciye URL'yi depolamama ve gelecekte kullanmama durumunu gösterir.

Durum kodları hakkında daha fazla bilgi için bkz. RFC 2616: Durum Kodu Tanımları.

URL yeniden yazma, istemcinin istenenden farklı bir kaynak adresine sahip bir kaynak sağlayan sunucu tarafı işlemidir. URL'yi yeniden yazmak için sunucuya gidiş dönüş gerekli değil. Yeniden yazılan URL istemciye döndürülz ve tarayıcının adres çubuğunda görünmez.

üzerine /resource yeniden /different-resource yazılırsa, sunucu dahili olarak kaynağı konumuna getirir ve /different-resource döndürür.

İstemci, yeniden yazılan URL'de kaynağı alsa da, isteğinde olduğunda ve yanıtı aldığında kaynağın yeniden yazılan URL'de olduğu konusunda bilgi sahibi değildir.

Bir WebAPI hizmet uç noktası, sunucu üzerinde sürüm 1'den (v1) sürüm 2'ye (v2) değiştirilmiştir. İstemci, hizmete /v1/api sürüm 1 yolundan bir istekte bulundu. Hizmete /v2/api sürüm 2 yolundan erişmek için istek URL'si yeniden yazılır. Hizmet, istemciye 200 (Tamam) durum koduyla yanıt verir.

URL yeniden yazma örnek uygulaması

Örnek uygulamasıyla URL Yeniden Yazma Ara Yazılımı'nın özelliklerini keşfedebilirsiniz. Uygulama yeniden yönlendirme ve yeniden yazma kuralları uygular ve çeşitli senaryolar için yeniden yönlendirilen veya yeniden yazılan URL'yi gösterir.

URL Yeniden Yazma Ara Yazılımı ne zaman kullanmalı?

Aşağıdaki yaklaşımları kullanamıyorsanız URL Yeniden Yazma Ara Yazılımı kullanın:

Ayrıca, uygulamaHTTP.sys (eski adı WebListener) olduğunda ara yazılımı kullanın.

IIS, Apache ve Nginx'te sunucu tabanlı URL yeniden yazma teknolojilerini kullanmanın temel nedenleri:

  • Ara yazılım, bu modüllerin tüm özelliklerini desteklemez.

    Sunucu modüllerinin bazı özellikleri, IIS Yeniden Yazma ASP.NET Core ve kısıtlamaları gibi temel IsFile IsDirectory projelerle birlikte çalışmaz. Bu senaryolarda bunun yerine ara yazılımı kullanın.

  • Ara yazılımların performansı büyük olasılıkla modüllerin performansıyla eşleşmez.

    Karşılaştırma, performansı en çok hangi yaklaşımın düşürülmüş olduğunu veya performansın düşürülmüş olup olamayazılı olduğundan emin olmak için tek yoldur.

Paket

URL Yeniden Yazma Ara Yazılımı Microsoft.AspNetCore.Rewrite paketi tarafından sağlanır ve bu paket, ASP.NET Core dahil edilir.

Uzantı ve seçenekler

Her yeniden yazma kuralınız için uzantı yöntemleriyle RewriteOptions sınıfının bir örneğini oluşturarak URL yeniden yazma ve yeniden yönlendirme kuralları oluşturma. Birden çok kuralı işlenmelerini sırasıyla zincirleme. , ile istek işlem hattına eklendiklerine göre URL Yeniden Yazma Ara RewriteOptions Yazılımına UseRewriter geçirildi:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

www olmayan adresi www'ye yeniden yönlendirme

Üç seçenek, uygulamanın istek olmayanları www uygulamasına yeniden yönlendirmesini www sağlar:

URL yeniden yönlendirme

İstekleri AddRedirect yeniden yönlendirmek için kullanın. İlk parametre, gelen URL'nin yolunda eşleştirmek için regex'inizi içerir. İkinci parametre, değiştirme dizesidir. Varsa üçüncü parametre durum kodunu belirtir. Durum kodunu belirtmezseniz, durum kodu varsayılan olarak 302 - Bulundu olur. Bu, kaynağın geçici olarak taşındığını veya değiştirdiğini gösterir.

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Geliştirici araçlarının etkin olduğu bir tarayıcıda, yoluyla örnek uygulamaya bir istekte /redirect-rule/1234/5678 bulundurabilirsiniz. Regex, üzerinde istek yolu ile redirect-rule/(.*) eştir ve yolu ile /redirected/1234/5678 değiştirilir. Yeniden yönlendirme URL'si, 302 - Bulundu durum koduyla istemciye geri gönderilir. Tarayıcı, yeniden yönlendirme URL'sinde tarayıcının adres çubuğunda görünen yeni bir istekte bulundu. Örnek uygulamanın yeniden yönlendirme URL'sinde hiçbir kural eşleşmez:

  • İkinci istek, uygulamadan 200 - Tamam yanıtı alır.
  • Yanıtın gövdesi yeniden yönlendirme URL'sini gösterir.

URL yeniden yönlendirilmesi sırasında sunucuya gidiş dönüş yapılır.

Uyarı

Yeniden yönlendirme kuralları kurulurken dikkatli olun. Yeniden yönlendirme kuralları, yeniden yönlendirme sonrasında da dahil olmak üzere uygulamaya yapılan her istekte değerlendirilir. Yanlışlıkla sonsuz yeniden yönlendirme döngüsü oluşturmak kolaydır.

Özgün İstek: /redirect-rule/1234/5678

İstekleri ve Geliştirici Araçları izlemenin açık olduğu tarayıcı penceresi

İfadenin parantez içinde yer alan bölümü yakalama grubu olarak adlandırılan bir gruptur. İfadenin noktası ( . ) herhangi bir karakterle eşleşme anlamına gelir. Yıldız işareti ( ) önceki * karakterle sıfır veya daha fazla eşleşme olduğunu gösterir. Bu nedenle, URL'nin son iki yol segmenti 1234/5678 , yakalama grubu tarafından yakalanır. (.*) İstek URL'sinde sonra sağ istediğiniz herhangi redirect-rule/ bir değer bu tek yakalama grubu tarafından yakalanır.

Değiştirilen dizede yakalanan gruplar, dolar işareti ( ) ile dizeye ve ardından $ yakalamanın sıra numarasına göre oluşturulur. İlk yakalama grubu değeri ile elde edilir, ikinci değeri ile elde edilir ve bunlar $1 $2 regex'inize yakalama grupları için sırayla devam eder. Örnek uygulamadaki yeniden yönlendirme kuralı Regex bölümünde yalnızca bir tane yakalanan grup bulunur, bu nedenle değiştirme dizesinde yalnızca bir tane eklenmiş grup vardır $1 . Kural uygulandığında, URL olur /redirected/1234/5678 .

Güvenli bir uç noktaya URL yönlendirmesi

AddRedirectToHttpsHttp ISTEKLERINI https protokolünü kullanarak aynı konağa ve yola yeniden yönlendirmek için kullanın. Durum kodu sağlanmazsa, ara yazılım varsayılan olarak 302-bulunur. Bağlantı noktası sağlanmazsa:

  • Ara yazılım varsayılan olarak olur null .
  • Şema https (https Protokolü) olarak değişir ve istemci, 443 numaralı bağlantı noktasında kaynağa erişir.

Aşağıdaki örnek, durum kodunun 301-kalıcı olarak taşınacağını ve bağlantı noktasını 5001 olarak nasıl değiştirileceğini gösterir.

public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttps(301, 5001);

    app.UseRewriter(options);
}

AddRedirectToHttpsPermanentGüvenli olmayan istekleri, bağlantı noktası 443 üzerinde GÜVENLI https Protokolü ile aynı konağa ve yola yeniden yönlendirmek için kullanın. Ara yazılım durum kodunu 301 olarak ayarlar ve kalıcı olarak taşınır.

public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent();

    app.UseRewriter(options);
}

Not

Ek yeniden yönlendirme kuralları gereksinimi olmadan güvenli bir uç noktaya yönlendirilirken, HTTPS yeniden yönlendirme ara yazılımı kullanmanızı öneririz. Daha fazla bilgi için bkz. https 'Yi zorla konusu.

Örnek uygulama, veya kullanımını gösterme yeteneğine sahiptir AddRedirectToHttps AddRedirectToHttpsPermanent . Uzantı yöntemini öğesine ekleyin RewriteOptions . Herhangi bir URL 'de uygulamaya güvenli olmayan bir istek oluşturun. Otomatik olarak imzalanan sertifikanın güvenilmeyen tarayıcı güvenlik uyarısını kapatın veya sertifikaya güvenmek için bir özel durum oluşturun.

Kullanarak özgün Istek AddRedirectToHttps(301, 5001) : http://localhost:5000/secure

İstekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Kullanarak özgün Istek AddRedirectToHttpsPermanent : http://localhost:5000/secure

İstekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

URL yeniden yazma

AddRewriteURL 'leri yeniden yazma kuralı oluşturmak için kullanın. İlk parametre gelen URL yolundaki eşleşme için Regex içerir. İkinci parametre değiştirme dizesidir. Üçüncü parametresi, skipRemainingRules: {true|false} geçerli kural uygulanmışsa ek yeniden yazma kurallarının atlanıp atlanmayacağını gösterir.

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Özgün Istek: /rewrite-rule/1234/5678

İsteği ve yanıtı izleyen Geliştirici Araçları tarayıcı penceresi

İfadenin başındaki simgeyi seçtiğinizde ( ^ ), eşleşmesinin URL yolunun başlangıcında başladığı anlamına gelir.

Önceki örnekte, yeniden yönlendirme kuralıyla, Regex başlangıcında redirect-rule/(.*) simgeyi seçtiğinizde ( ^ ) yoktur. Bu nedenle, redirect-rule/ başarılı bir eşleşme için herhangi bir karakterden önce yol açabilir.

Yol Eşleştirme
/redirect-rule/1234/5678 Yes
/my-cool-redirect-rule/1234/5678 Yes
/anotherredirect-rule/1234/5678 Yes

Yeniden yazma kuralı, ^rewrite-rule/(\d+)/(\d+) yalnızca ile başlarsa yollarla eşleşir rewrite-rule/ . Aşağıdaki tabloda, eşleşen farkı aklınızda.

Yol Eşleştirme
/rewrite-rule/1234/5678 Yes
/my-cool-rewrite-rule/1234/5678 Hayır
/anotherrewrite-rule/1234/5678 Hayır

^rewrite-rule/İfadenin bölümünü takip eden iki yakalama grubu vardır (\d+)/(\d+) . \dBelirtir bir sayıyla (sayı) eşleşir. Artı işareti ( + ) bir veya daha fazla önceki karakterden eşleşiyor demektir. Bu nedenle, URL bir sayı içermeli ve ardından İleri eğik çizgi ve ardından başka bir sayı içermelidir. Bu yakalama grupları, ve olarak yeniden yazan URL 'sine $1 eklenir $2 . Yeniden yazma kuralı değiştirme dizesi yakalanan grupları sorgu dizesine koyar. İstenen yolu, /rewrite-rule/1234/5678 kaynağı elde etmek için yeniden yazılır /rewritten?var1=1234&var2=5678 . Özgün istekte bir sorgu dizesi varsa, URL yeniden yazdığınızda korunur.

Kaynağı almak için sunucuya gidiş dönüş yok. Kaynak varsa, bu, alınır ve istemciye 200-ok durum kodu ile döndürülür. İstemci yeniden yönlendirmediği için tarayıcının adres çubuğundaki URL değişmez. İstemciler, sunucuda bir URL yeniden yazma işleminin gerçekleştiğini algılayamaz.

Not

skipRemainingRules: trueEşleşen kuralların hesaplama maliyeti ve uygulama yanıt süresini arttığı için mümkün olan her durumda kullanın. En hızlı uygulama yanıtı için:

  • En sık eşleşen kuraldan en az sıklıkta eşleşen kurala göre yeniden yazma kuralları.
  • Bir eşleşme gerçekleştiğinde ve ek kural işleme gerekli olmadığında kalan kuralların işlenmesini atlayın.

Apache mod_rewrite

İle Apache mod_rewrite kuralları uygulayın AddApacheModRewrite . Kurallar dosyasının uygulamayla birlikte dağıtıldığından emin olun. Daha fazla bilgi ve mod_rewrite kuralları örnekleri için bkz. Apache mod_rewrite.

, StreamReader ApacheModRewrite.txt kuralları dosyasındaki kuralları okumak için kullanılır:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Örnek uygulama, istekleri ' den ' e yeniden yönlendirir /apache-mod-rules-redirect/(.\*) /redirected?id=$1 . Yanıt durum kodu 302-bulundu.

# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]

Özgün Istek: /apache-mod-rules-redirect/1234

İstekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Ara yazılım aşağıdaki Apache mod_rewrite sunucu değişkenlerini destekler:

  • CONN_REMOTE_ADDR
  • HTTP_ACCEPT
  • HTTP_CONNECTION
  • HTTP_COOKIE
  • HTTP_FORWARDED
  • HTTP_HOST
  • HTTP_REFERER
  • HTTP_USER_AGENT
  • HTTPS
  • IPV6
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_PORT
  • REQUEST_FILENAME
  • REQUEST_METHOD
  • REQUEST_SCHEME
  • REQUEST_URI
  • SCRIPT_FILENAME
  • SERVER_ADDR
  • SERVER_PORT
  • SERVER_PROTOCOL
  • TIME
  • TIME_DAY
  • TIME_HOUR
  • TIME_MIN
  • TIME_MON
  • TIME_SEC
  • TIME_WDAY
  • TIME_YEAR

IIS URL yeniden yazma modülü kuralları

IIS URL yeniden yazma modülü için geçerli olan kural kümesini kullanmak için kullanın AddIISUrlRewrite . Kurallar dosyasının uygulamayla birlikte dağıtıldığından emin olun. Windows Server ııs üzerinde çalışırken uygulamanın web.config dosyasını kullanmaya yönelik ara yazılımı yönlendirmeyin. IIS ile, IIS yeniden yazma modülüyle çakışmalardan kaçınmak için bu kuralların uygulamanın web.config dosyası dışında depolanması gerekir. Daha fazla bilgi ve IIS URL yeniden yazma modülü kurallarının örnekleri için bkz. Using URL yeniden yazma modülü 2,0 ve URL yeniden yazma modülü yapılandırma başvurusu.

, StreamReader IISUrlRewrite.xml kuralları dosyasındaki kuralları okumak için kullanılır:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Örnek uygulama, ' den ' e olan istekleri yeniden yazar /iis-rules-rewrite/(.*) /rewritten?id=$1 . Yanıt, istemciye 200-ok durum kodu ile gönderilir.

<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

Özgün Istek: /iis-rules-rewrite/1234

İsteği ve yanıtı izleyen Geliştirici Araçları tarayıcı penceresi

Uygulamanızı istenmeyen yollarla etkileyebilecek sunucu düzeyi kurallara sahip etkin bir IIS yeniden yazma modülünüzün olması halinde, bir uygulama için IIS yeniden yazma modülünü devre dışı bırakabilirsiniz. Daha fazla bilgi için bkz. IIS modüllerini devre dışı bırakma.

Desteklenmeyen özellikler

Ara yazılım aşağıdaki IIS URL yeniden yazma modülü özelliklerini desteklemez:

  • Giden Kuralları
  • Özel sunucu değişkenleri
  • Joker karakterler
  • LogRewrittenUrl 'Si

Desteklenen sunucu değişkenleri

Ara yazılım aşağıdaki IIS URL yeniden yazma modülü sunucu değişkenlerini destekler:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • HTTP_ACCEPT
  • HTTP_CONNECTION
  • HTTP_COOKIE
  • HTTP_HOST
  • HTTP_REFERER
  • HTTP_URL
  • HTTP_USER_AGENT
  • HTTPS
  • LOCAL_ADDR
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_PORT
  • REQUEST_FILENAME
  • REQUEST_URI

Not

Ayrıca bir ile elde edebilirsiniz IFileProvider PhysicalFileProvider . Bu yaklaşım, yeniden yazma kuralları dosyalarınızın konumu için daha fazla esneklik sağlayabilir. Yeniden yazma kuralları dosyalarınızın sağladığınız yoldaki sunucuya dağıtıldığından emin olun.

PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());

Yöntem tabanlı kural

AddBir yöntemde kendi kural mantığınızı uygulamak için kullanın. Add , RewriteContext metodunda kullanım için kullanılabilir hale getiren öğesini gösterir HttpContext . Rewritecontext. Result , ek ardışık düzen işlemenin nasıl işlendiğini belirler. Değeri RuleResult Aşağıdaki tabloda açıklanan alanlardan birine ayarlayın.

Bağlam sonucunu yeniden yaz Eylem
RuleResult.ContinueRules varsayılanını Kuralları uygulamaya devam edin.
RuleResult.EndResponse Kuralları uygulamayı durdurun ve yanıtı gönderin.
RuleResult.SkipRemainingRules Kuralları uygulamayı durdurun ve bağlamı bir sonraki ara yazılıma gönderin.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Örnek uygulama, .xml ile biten yollar için istekleri yeniden yönlendiren bir yöntemi gösterir. İçin bir istek yapılırsa /file.xml , istek öğesine yeniden yönlendirilir /xmlfiles/file.xml . Durum kodu 301 olarak ayarlanır. Tarayıcı /xmlfiles/file.xml için yeni bir istek yaptığında, statik dosya ara yazılımı dosyayı Wwwroot/xmlfiles klasöründen istemciye sunar. Yeniden yönlendirme için, yanıtın durum kodunu açık olarak ayarlayın. Aksi takdirde, 200-ok durum kodu döndürülür ve yeniden yönlendirme istemcide gerçekleşmez.

RewriteRules. cs:

public static void RedirectXmlFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;

    // Because the client is redirecting back to the same app, stop 
    // processing if the request has already been redirected.
    if (request.Path.StartsWithSegments(new PathString("/xmlfiles")))
    {
        return;
    }

    if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) HttpStatusCode.MovedPermanently;
        context.Result = RuleResult.EndResponse;
        response.Headers[HeaderNames.Location] = 
            "/xmlfiles" + request.Path + request.QueryString;
    }
}

Bu yaklaşım ayrıca istekleri yeniden yazabilir. Örnek uygulama, herhangi bir metin dosyası isteğinin yolunu Wwwroot klasöründen file.txt metin dosyasına sunacak şekilde yeniden yazmayı gösterir. Statik dosya ara yazılımı, güncelleştirilmiş istek yoluna göre dosyayı sunar:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

RewriteRules. cs:

public static void RewriteTextFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;

    if (request.Path.Value.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
    {
        context.Result = RuleResult.SkipRemainingRules;
        request.Path = "/file.txt";
    }
}

Irule tabanlı kural

AddArabirimini uygulayan bir sınıfta kural mantığını kullanmak için kullanın IRule . IRule Yöntem tabanlı kural yaklaşımını kullanarak daha fazla esneklik sağlar. Uygulama sınıfınız, yöntemi için parametreleri geçirebilmeniz için bir Oluşturucu içerebilir ApplyRule .

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Ve için örnek uygulamadaki parametrelerin değerleri, extension newPath çeşitli koşullara uyacak şekilde denetlenir. extensionBir değer içermesi ve değerin .png, .jpg veya .gif olması gerekir. newPathGeçerli değilse, bir oluşturulur ArgumentException . image.png için bir istek yapılırsa, istek öğesine yeniden yönlendirilir /png-images/image.png . image.jpg için bir istek yapılırsa, istek öğesine yeniden yönlendirilir /jpg-images/image.jpg . Durum kodu 301 olarak ayarlanır ve kalıcı olarak taşınır ve context.Result kuralları işlemeyi durdur ve yanıtı gönder olarak ayarlanır.

public class RedirectImageRequests : IRule
{
    private readonly string _extension;
    private readonly PathString _newPath;

    public RedirectImageRequests(string extension, string newPath)
    {
        if (string.IsNullOrEmpty(extension))
        {
            throw new ArgumentException(nameof(extension));
        }

        if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
        {
            throw new ArgumentException("Invalid extension", nameof(extension));
        }

        if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
        {
            throw new ArgumentException("Invalid path", nameof(newPath));
        }

        _extension = extension;
        _newPath = new PathString(newPath);
    }

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        // Because we're redirecting back to the same app, stop 
        // processing if the request has already been redirected
        if (request.Path.StartsWithSegments(new PathString(_newPath)))
        {
            return;
        }

        if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = (int) HttpStatusCode.MovedPermanently;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = 
                _newPath + request.Path + request.QueryString;
        }
    }
}

Özgün Istek: /image.png

image.png için istekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Özgün Istek: /image.jpg

image.jpg için istekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Regex örnekleri

Hedef Regex dize &
Match örneği
Değiştirme dizesi &
Çıkış örneği
Yolu QueryString 'e yeniden yazın ^path/(.*)/(.*)
/path/abc/123
path?var1=$1&var2=$2
/path?var1=abc&var2=123
Eğik çizgiyi çıkar (.*)/$
/path/
$1
/path
Sondaki eğik çizgiyi zorla (.*[^/])$
/path
$1/
/path/
Belirli istekleri yeniden yazmayı önleyin ^(.*)(?<!\.axd)$ veya ^(?!.*\.axd$)(.*)$
Yes /resource.htm
Eşleşen /resource.axd
rewritten/$1
/rewritten/resource.htm
/resource.axd
URL segmentlerini yeniden Düzenle path/(.*)/(.*)/(.*)
path/1/2/3
path/$3/$2/$1
path/3/2/1
URL segmentini değiştirme ^(.*)/segment2/(.*)
/segment1/segment2/segment3
$1/replaced/$2
/segment1/replaced/segment3

bu belgede, ASP.NET Core uygulamalarında url yeniden yazma ara yazılımı kullanma yönergeleriyle birlikte url yeniden yazma tanıtılmaktadır.

URL yeniden yazma, istek URL 'Lerini bir veya daha fazla önceden tanımlanmış kurala göre değiştirme işlemidir. URL yeniden yazma, konumların ve adreslerin sıkı bir şekilde bağlanmaması için kaynak konumları ve adresleri arasında bir soyutlama oluşturur. URL yeniden yazma işlemi birkaç senaryoda yararlı olur:

  • Sunucu kaynaklarını geçici olarak veya kalıcı olarak taşıyın veya değiştirin ve bu kaynakların kararlı konum belirleyicilerinin bakımını yapın.
  • İstek işlemeyi farklı uygulamalar arasında veya bir uygulamanın alanlarında bölme.
  • Gelen isteklerde URL segmentlerini kaldırın, ekleyin veya yeniden düzenleyin.
  • Arama motoru Iyileştirmesi (SEO) için genel URL 'Leri iyileştirin.
  • Ziyaretçilerin bir kaynak isteyerek döndürülen içeriği tahmin etmeye yardımcı olmak için kolay genel URL 'Lerin kullanılmasına izin verme.
  • Güvensiz istekleri güvenli uç noktalara yönlendirin.
  • Bir dış sitenin varlığı kendi içeriğine bağlayarak başka bir sitede barındırılan statik bir varlık kullandığı Hotlink 'i engelleyin.

Not

URL yeniden yazma, uygulamanın performansını düşürebilir. Uygunsa kuralların sayısını ve karmaşıklığını sınırla.

Örnek kodu görüntüleme veya indirme ( nasılindir)

URL yeniden yönlendirme ve URL yeniden yazma

URL yeniden yönlendirme ile URL yeniden yazma arasındaki ifade farkı belirsizdir, ancak istemcilere kaynak sağlama konusunda önemli etkileri vardır. ASP.NET Core URL Yeniden Yazma Ara Yazılımı her ikisi için de ihtiyacı karşılar.

URL yeniden yönlendirmesi, istemcinin başlangıçta istenenden farklı bir adresteki bir kaynağa erişmesi istenen bir istemci tarafı işlemi içerir. Bunun için sunucuya gidiş dönüş gerekir. İstemciye döndürülen yeniden yönlendirme URL'si, istemci kaynak için yeni bir istekte olduğunda tarayıcının adres çubuğunda görünür.

, 'a yeniden yönlendirilmesi durumunda sunucu, yeniden yönlendirmenin geçici veya kalıcı olduğunu belirten bir durum koduyla istemcinin kaynağı /resource /different-resource /different-resource alması gerektiğine yanıt verir.

Sunucu üzerinde bir WebAPI hizmet uç noktası geçici olarak sürüm 1'den (v1) sürüm 2'ye (v2) değiştirildi. İstemci, hizmete /v1/api sürüm 1 yolundan bir istekte bulundu. Sunucu, hizmet için yeni, geçici yolu 2 /v2/api sürümünde olan 302 (Bulundu) yanıtını geri gönderir. İstemci, yeniden yönlendirme URL'sini kullanarak hizmete ikinci bir istek yapar. Sunucu 200 (Tamam) durum koduyla yanıt verir.

İstekleri farklı bir URL'ye yeniden yönlendirerek, yanıtla birlikte durum kodunu belirterek yeniden yönlendirmenin kalıcı mı yoksa geçici mi olduğunu belirtin:

  • 301 - Taşınan Kalıcı durum kodu, kaynağın yeni, kalıcı bir URL'ye sahip olduğu yerde kullanılır ve istemciye gelecekte kaynakla ilgili tüm isteklerin yeni URL'yi kullanması gerektiğini belirtirsiniz. İstemci, 301 durum kodu alınca yanıtı önbelleğe almış ve yeniden kullanabilir.

  • 302 - Yeniden yönlendirmenin geçici olduğu veya genellikle değişebilir olduğu durum kodu kullanılır. 302 durum kodu istemciye URL'yi depolamama ve gelecekte kullanmama durumunu gösterir.

Durum kodları hakkında daha fazla bilgi için bkz. RFC 2616: Durum Kodu Tanımları.

URL yeniden yazma, istemcinin istenenden farklı bir kaynak adresine sahip bir kaynak sağlayan sunucu tarafı işlemidir. URL'yi yeniden yazmak için sunucuya gidiş dönüş gerekli değil. Yeniden yazılan URL istemciye döndürülz ve tarayıcının adres çubuğunda görünmez.

üzerine /resource yeniden /different-resource yazılırsa, sunucu dahili olarak kaynağı konumuna getirir ve /different-resource döndürür.

İstemci, yeniden yazılan URL'de kaynağı alsa da, isteğinde olduğunda ve yanıtı aldığında kaynağın yeniden yazılan URL'de olduğu konusunda bilgi sahibi değildir.

Bir WebAPI hizmet uç noktası, sunucu üzerinde sürüm 1'den (v1) sürüm 2'ye (v2) değiştirilmiştir. İstemci, hizmete /v1/api sürüm 1 yolundan bir istekte bulundu. Hizmete /v2/api sürüm 2 yolundan erişmek için istek URL'si yeniden yazılır. Hizmet, istemciye 200 (Tamam) durum koduyla yanıt verir.

URL yeniden yazma örnek uygulaması

Örnek uygulamasıyla URL Yeniden Yazma Ara Yazılımı'nın özelliklerini keşfedebilirsiniz. Uygulama yeniden yönlendirme ve yeniden yazma kuralları uygular ve çeşitli senaryolar için yeniden yönlendirilen veya yeniden yazılan URL'yi gösterir.

URL Yeniden Yazma Ara Yazılımı ne zaman kullanmalı?

Aşağıdaki yaklaşımları kullanamıyorsanız URL Yeniden Yazma Ara Yazılımı kullanın:

Ayrıca, uygulama bir sunucu üzerinde barındırıldıyken (eski adı WebListenerHTTP.sys ara yazılımı kullanın.

IIS, Apache ve Nginx'te sunucu tabanlı URL yeniden yazma teknolojilerini kullanmanın temel nedenleri:

  • Ara yazılım, bu modüllerin tüm özelliklerini desteklemez.

    Sunucu modüllerinin bazı özellikleri, IIS Yeniden Yazma modülünün ASP.NET Core kısıtlamaları gibi farklı projelerle IsFile IsDirectory birlikte çalışmaz. Bu senaryolarda bunun yerine ara yazılımı kullanın.

  • Ara yazılımların performansı büyük olasılıkla modüllerin performansıyla eşleşmez.

    Karşılaştırma, performansı en çok hangi yaklaşımın düşürülmüş olduğunu veya performansın düşürülmüş olup olamayazılı olduğundan emin olmak için tek yoldur.

Paket

Ara yazılımı projenize dahil etmek için, Microsoft.AspNetCore.Rewrite paketini içeren proje dosyasındaki Microsoft.AspNetCore.App meta paketine bir paket başvurusu ekleyin.

Meta paketi Microsoft.AspNetCore.App kullanmazken, pakete bir proje başvurusu Microsoft.AspNetCore.Rewrite ekleyin.

Uzantı ve seçenekler

Her yeniden yazma kuralınız için uzantı yöntemleriyle RewriteOptions sınıfının bir örneğini oluşturarak URL yeniden yazma ve yeniden yönlendirme kuralları oluşturma. Birden çok kuralı işlenmelerini sırasıyla zincirleme. , ile istek işlem hattına eklendiklerine göre URL Yeniden Yazma Ara RewriteOptions Yazılımına UseRewriter geçirildi:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

www olmayan adresi www'ye yeniden yönlendirme

Üç seçenek, uygulamanın istek olmayanları www uygulamasına yeniden yönlendirmesini www sağlar:

URL yeniden yönlendirme

İstekleri AddRedirect yeniden yönlendirmek için kullanın. İlk parametre, gelen URL'nin yolunda eşleştirmek için regex'inizi içerir. İkinci parametre, değiştirme dizesidir. Varsa üçüncü parametre durum kodunu belirtir. Durum kodunu belirtmezseniz, durum kodu varsayılan olarak 302 - Bulundu olur. Bu, kaynağın geçici olarak taşındığını veya değiştirdiğini gösterir.

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Geliştirici araçlarının etkin olduğu bir tarayıcıda, yoluyla örnek uygulamaya bir istekte /redirect-rule/1234/5678 bulundurabilirsiniz. Regex, üzerinde istek yolu ile redirect-rule/(.*) eştir ve yolu ile /redirected/1234/5678 değiştirilir. Yeniden yönlendirme URL'si, 302 - Bulundu durum koduyla istemciye geri gönderilir. Tarayıcı, yeniden yönlendirme URL'sinde tarayıcının adres çubuğunda görünen yeni bir istekte bulundu. Örnek uygulamanın yeniden yönlendirme URL'sinde hiçbir kural eşleşmez:

  • İkinci istek, uygulamadan 200 - Tamam yanıtı alır.
  • Yanıtın gövdesi yeniden yönlendirme URL'sini gösterir.

URL yeniden yönlendirilmesi sırasında sunucuya gidiş dönüş yapılır.

Uyarı

Yeniden yönlendirme kuralları kurulurken dikkatli olun. Yeniden yönlendirme kuralları, yeniden yönlendirme sonrasında da dahil olmak üzere uygulamaya yapılan her istekte değerlendirilir. Yanlışlıkla sonsuz yeniden yönlendirme döngüsü oluşturmak kolaydır.

Özgün İstek: /redirect-rule/1234/5678

İstekleri ve Geliştirici Araçları izlemenin açık olduğu tarayıcı penceresi

İfadenin parantez içinde yer alan bölümü yakalama grubu olarak adlandırılan bir gruptur. İfadenin noktası ( . ) herhangi bir karakterle eşleşme anlamına gelir. Yıldız işareti ( ) önceki * karakterle sıfır veya daha fazla eşleşme olduğunu gösterir. Bu nedenle, URL'nin son iki yol segmenti 1234/5678 , yakalama grubu tarafından yakalanır. (.*) İstek URL'sinde sonra sağ istediğiniz herhangi redirect-rule/ bir değer bu tek yakalama grubu tarafından yakalanır.

Değiştirilen dizede yakalanan gruplar, dolar işareti ( ) ile dizeye ve ardından $ yakalamanın sıra numarasına göre oluşturulur. İlk yakalama grubu değeri ile elde edilir, ikinci değeri ile elde edilir ve bunlar $1 $2 regex'inize yakalama grupları için sırayla devam eder. Örnek uygulamada yeniden yönlendirme kuralı ifadesinde yakalanan tek bir grup olduğu için değiştirme dizesinde yalnızca bir grup (yani ) $1 vardır. Kural uygulandığında URL /redirected/1234/5678 olur.

Güvenli uç noktasına URL yeniden yönlendirme

AddRedirectToHttpsHTTPS protokolünü kullanarak HTTP isteklerini aynı ana bilgisayar ve yola yeniden yönlendirmek için kullanın. Durum kodu sağlanmadı ise ara yazılım varsayılan olarak 302 - Bulundu olur. Bağlantı noktası sağlanmadı ise:

  • Ara yazılım varsayılan olarak olarak null kullanılır.
  • Şema olarak değişir https (HTTPS protokolü) ve istemci 443 bağlantı noktası üzerinden kaynağa erişer.

Aşağıdaki örnek, durum kodunun 301 - Kalıcı Olarak Taşındı olarak ayar ve bağlantı noktasını 5001 olarak değiştirmeyi gösterir.

public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttps(301, 5001);

    app.UseRewriter(options);
}

Güvenli AddRedirectToHttpsPermanent olmayan istekleri bağlantı noktası 443'te güvenli HTTPS protokolüyle aynı ana bilgisayar ve yola yeniden yönlendirmek için kullanın. Ara yazılım durum kodunu 301 - Kalıcı olarak taşındı olarak ayarlar.

public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent();

    app.UseRewriter(options);
}

Not

Ek yeniden yönlendirme kurallarına gerek kalmadan güvenli bir uç noktasına yeniden yönlendirmede HTTPS Yeniden Yönlendirme Ara Yazılımı'nın kullanılması önerilir. Daha fazla bilgi için HTTPS'yi zorlama konu başlığına bakın.

Örnek uygulama, veya kullanımını gösterme AddRedirectToHttps özelliğine AddRedirectToHttpsPermanent sahip. Uzantı yöntemini öğesine ekleyin RewriteOptions . Herhangi bir URL 'de uygulamaya güvenli olmayan bir istek oluşturun. Otomatik olarak imzalanan sertifikanın güvenilmeyen tarayıcı güvenlik uyarısını kapatın veya sertifikaya güvenmek için bir özel durum oluşturun.

Kullanarak özgün Istek AddRedirectToHttps(301, 5001) : http://localhost:5000/secure

İstekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Kullanarak özgün Istek AddRedirectToHttpsPermanent : http://localhost:5000/secure

İstekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

URL yeniden yazma

AddRewriteURL 'leri yeniden yazma kuralı oluşturmak için kullanın. İlk parametre gelen URL yolundaki eşleşme için Regex içerir. İkinci parametre değiştirme dizesidir. Üçüncü parametresi, skipRemainingRules: {true|false} geçerli kural uygulanmışsa ek yeniden yazma kurallarının atlanıp atlanmayacağını gösterir.

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Özgün Istek: /rewrite-rule/1234/5678

İsteği ve yanıtı izleyen Geliştirici Araçları tarayıcı penceresi

İfadenin başındaki simgeyi seçtiğinizde ( ^ ), eşleşmesinin URL yolunun başlangıcında başladığı anlamına gelir.

Önceki örnekte, yeniden yönlendirme kuralıyla, Regex başlangıcında redirect-rule/(.*) simgeyi seçtiğinizde ( ^ ) yoktur. Bu nedenle, redirect-rule/ başarılı bir eşleşme için herhangi bir karakterden önce yol açabilir.

Yol Eşleştirme
/redirect-rule/1234/5678 Yes
/my-cool-redirect-rule/1234/5678 Yes
/anotherredirect-rule/1234/5678 Yes

Yeniden yazma kuralı, ^rewrite-rule/(\d+)/(\d+) yalnızca ile başlarsa yollarla eşleşir rewrite-rule/ . Aşağıdaki tabloda, eşleşen farkı aklınızda.

Yol Eşleştirme
/rewrite-rule/1234/5678 Yes
/my-cool-rewrite-rule/1234/5678 Hayır
/anotherrewrite-rule/1234/5678 Hayır

^rewrite-rule/İfadenin bölümünü takip eden iki yakalama grubu vardır (\d+)/(\d+) . \dBelirtir bir sayıyla (sayı) eşleşir. Artı işareti ( + ) bir veya daha fazla önceki karakterden eşleşiyor demektir. Bu nedenle, URL bir sayı içermeli ve ardından İleri eğik çizgi ve ardından başka bir sayı içermelidir. Bu yakalama grupları, ve olarak yeniden yazan URL 'sine $1 eklenir $2 . Yeniden yazma kuralı değiştirme dizesi yakalanan grupları sorgu dizesine koyar. İstenen yolu, /rewrite-rule/1234/5678 kaynağı elde etmek için yeniden yazılır /rewritten?var1=1234&var2=5678 . Özgün istekte bir sorgu dizesi varsa, URL yeniden yazdığınızda korunur.

Kaynağı almak için sunucuya gidiş dönüş yok. Kaynak varsa, bu, alınır ve istemciye 200-ok durum kodu ile döndürülür. İstemci yeniden yönlendirmediği için tarayıcının adres çubuğundaki URL değişmez. İstemciler, sunucuda bir URL yeniden yazma işleminin gerçekleştiğini algılayamaz.

Not

skipRemainingRules: trueEşleşen kuralların hesaplama maliyeti ve uygulama yanıt süresini arttığı için mümkün olan her durumda kullanın. En hızlı uygulama yanıtı için:

  • En sık eşleşen kuraldan en az sıklıkta eşleşen kurala göre yeniden yazma kuralları.
  • Bir eşleşme gerçekleştiğinde ve ek kural işleme gerekli olmadığında kalan kuralların işlenmesini atlayın.

Apache mod_rewrite

İle Apache mod_rewrite kuralları uygulayın AddApacheModRewrite . Kurallar dosyasının uygulamayla birlikte dağıtıldığından emin olun. Daha fazla bilgi ve mod_rewrite kuralları örnekleri için bkz. Apache mod_rewrite.

, StreamReader ApacheModRewrite.txt kuralları dosyasındaki kuralları okumak için kullanılır:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Örnek uygulama, istekleri ' den ' e yeniden yönlendirir /apache-mod-rules-redirect/(.\*) /redirected?id=$1 . Yanıt durum kodu 302-bulundu.

# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]

Özgün Istek: /apache-mod-rules-redirect/1234

İstekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Ara yazılım aşağıdaki Apache mod_rewrite sunucu değişkenlerini destekler:

  • CONN_REMOTE_ADDR
  • HTTP_ACCEPT
  • HTTP_CONNECTION
  • HTTP_COOKIE
  • HTTP_FORWARDED
  • HTTP_HOST
  • HTTP_REFERER
  • HTTP_USER_AGENT
  • HTTPS
  • IPV6
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_PORT
  • REQUEST_FILENAME
  • REQUEST_METHOD
  • REQUEST_SCHEME
  • REQUEST_URI
  • SCRIPT_FILENAME
  • SERVER_ADDR
  • SERVER_PORT
  • SERVER_PROTOCOL
  • TIME
  • TIME_DAY
  • TIME_HOUR
  • TIME_MIN
  • TIME_MON
  • TIME_SEC
  • TIME_WDAY
  • TIME_YEAR

IIS URL yeniden yazma modülü kuralları

IIS URL yeniden yazma modülü için geçerli olan kural kümesini kullanmak için kullanın AddIISUrlRewrite . Kurallar dosyasının uygulamayla birlikte dağıtıldığından emin olun. Windows Server ııs üzerinde çalışırken uygulamanın web.config dosyasını kullanmaya yönelik ara yazılımı yönlendirmeyin. IIS ile, IIS yeniden yazma modülüyle çakışmalardan kaçınmak için bu kuralların uygulamanın web.config dosyası dışında depolanması gerekir. Daha fazla bilgi ve IIS URL yeniden yazma modülü kurallarının örnekleri için bkz. Using URL yeniden yazma modülü 2,0 ve URL yeniden yazma modülü yapılandırma başvurusu.

, StreamReader IISUrlRewrite.xml kuralları dosyasındaki kuralları okumak için kullanılır:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Örnek uygulama, ' den ' e olan istekleri yeniden yazar /iis-rules-rewrite/(.*) /rewritten?id=$1 . Yanıt, istemciye 200-ok durum kodu ile gönderilir.

<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

Özgün Istek: /iis-rules-rewrite/1234

İsteği ve yanıtı izleyen Geliştirici Araçları tarayıcı penceresi

Uygulamanızı istenmeyen yollarla etkileyebilecek sunucu düzeyi kurallara sahip etkin bir IIS yeniden yazma modülünüzün olması halinde, bir uygulama için IIS yeniden yazma modülünü devre dışı bırakabilirsiniz. Daha fazla bilgi için bkz. IIS modüllerini devre dışı bırakma.

Desteklenmeyen özellikler

ASP.NET Core 2. x ile yayınlanan ara yazılım, aşağıdaki ııs URL yeniden yazma modülü özelliklerini desteklemez:

  • Giden Kuralları
  • Özel sunucu değişkenleri
  • Joker karakterler
  • LogRewrittenUrl 'Si

Desteklenen sunucu değişkenleri

Ara yazılım aşağıdaki IIS URL yeniden yazma modülü sunucu değişkenlerini destekler:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • HTTP_ACCEPT
  • HTTP_CONNECTION
  • HTTP_COOKIE
  • HTTP_HOST
  • HTTP_REFERER
  • HTTP_URL
  • HTTP_USER_AGENT
  • HTTPS
  • LOCAL_ADDR
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_PORT
  • REQUEST_FILENAME
  • REQUEST_URI

Not

Ayrıca bir ile elde edebilirsiniz IFileProvider PhysicalFileProvider . Bu yaklaşım, yeniden yazma kuralları dosyalarınızın konumu için daha fazla esneklik sağlayabilir. Yeniden yazma kuralları dosyalarınızın sağladığınız yoldaki sunucuya dağıtıldığından emin olun.

PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());

Yöntem tabanlı kural

AddBir yöntemde kendi kural mantığınızı uygulamak için kullanın. Add , RewriteContext metodunda kullanım için kullanılabilir hale getiren öğesini gösterir HttpContext . Rewritecontext. Result , ek ardışık düzen işlemenin nasıl işlendiğini belirler. Değeri RuleResult Aşağıdaki tabloda açıklanan alanlardan birine ayarlayın.

Bağlam sonucunu yeniden yaz Eylem
RuleResult.ContinueRules varsayılanını Kuralları uygulamaya devam edin.
RuleResult.EndResponse Kuralları uygulamayı durdurun ve yanıtı gönderin.
RuleResult.SkipRemainingRules Kuralları uygulamayı durdurun ve bağlamı bir sonraki ara yazılıma gönderin.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Örnek uygulama, .xml ile biten yollar için istekleri yeniden yönlendiren bir yöntemi gösterir. İçin bir istek yapılırsa /file.xml , istek öğesine yeniden yönlendirilir /xmlfiles/file.xml . Durum kodu 301 olarak ayarlanır. Tarayıcı /xmlfiles/file.xml için yeni bir istek yaptığında, statik dosya ara yazılımı dosyayı Wwwroot/xmlfiles klasöründen istemciye sunar. Yeniden yönlendirme için, yanıtın durum kodunu açık olarak ayarlayın. Aksi takdirde, 200-ok durum kodu döndürülür ve yeniden yönlendirme istemcide gerçekleşmez.

RewriteRules. cs:

public static void RedirectXmlFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;

    // Because the client is redirecting back to the same app, stop 
    // processing if the request has already been redirected.
    if (request.Path.StartsWithSegments(new PathString("/xmlfiles")))
    {
        return;
    }

    if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) HttpStatusCode.MovedPermanently;
        context.Result = RuleResult.EndResponse;
        response.Headers[HeaderNames.Location] = 
            "/xmlfiles" + request.Path + request.QueryString;
    }
}

Bu yaklaşım ayrıca istekleri yeniden yazabilir. Örnek uygulama, herhangi bir metin dosyası isteğinin yolunu Wwwroot klasöründen file.txt metin dosyasına sunacak şekilde yeniden yazmayı gösterir. Statik dosya ara yazılımı, güncelleştirilmiş istek yoluna göre dosyayı sunar:

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

RewriteRules. cs:

public static void RewriteTextFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;

    if (request.Path.Value.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
    {
        context.Result = RuleResult.SkipRemainingRules;
        request.Path = "/file.txt";
    }
}

Irule tabanlı kural

AddArabirimini uygulayan bir sınıfta kural mantığını kullanmak için kullanın IRule . IRule Yöntem tabanlı kural yaklaşımını kullanarak daha fazla esneklik sağlar. Uygulama sınıfınız, yöntemi için parametreleri geçirebilmeniz için bir Oluşturucu içerebilir ApplyRule .

public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

        app.UseRewriter(options);
    }

    app.UseStaticFiles();

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

Ve için örnek uygulamadaki parametrelerin değerleri, extension newPath çeşitli koşullara uyacak şekilde denetlenir. extensionBir değer içermesi ve değerin .png, .jpg veya .gif olması gerekir. newPathGeçerli değilse, bir oluşturulur ArgumentException . image.png için bir istek yapılırsa, istek öğesine yeniden yönlendirilir /png-images/image.png . image.jpg için bir istek yapılırsa, istek öğesine yeniden yönlendirilir /jpg-images/image.jpg . Durum kodu 301 olarak ayarlanır ve kalıcı olarak taşınır ve context.Result kuralları işlemeyi durdur ve yanıtı gönder olarak ayarlanır.

public class RedirectImageRequests : IRule
{
    private readonly string _extension;
    private readonly PathString _newPath;

    public RedirectImageRequests(string extension, string newPath)
    {
        if (string.IsNullOrEmpty(extension))
        {
            throw new ArgumentException(nameof(extension));
        }

        if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
        {
            throw new ArgumentException("Invalid extension", nameof(extension));
        }

        if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
        {
            throw new ArgumentException("Invalid path", nameof(newPath));
        }

        _extension = extension;
        _newPath = new PathString(newPath);
    }

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        // Because we're redirecting back to the same app, stop 
        // processing if the request has already been redirected
        if (request.Path.StartsWithSegments(new PathString(_newPath)))
        {
            return;
        }

        if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = (int) HttpStatusCode.MovedPermanently;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = 
                _newPath + request.Path + request.QueryString;
        }
    }
}

Özgün Istek: /image.png

image.png için istekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Özgün Istek: /image.jpg

image.jpg için istekleri ve yanıtları izleyen Geliştirici Araçları tarayıcı penceresi

Regex örnekleri

Hedef Regex dize &
Match örneği
Değiştirme dizesi &
Çıkış örneği
Yolu QueryString 'e yeniden yazın ^path/(.*)/(.*)
/path/abc/123
path?var1=$1&var2=$2
/path?var1=abc&var2=123
Eğik çizgiyi çıkar (.*)/$
/path/
$1
/path
Sondaki eğik çizgiyi zorla (.*[^/])$
/path
$1/
/path/
Belirli istekleri yeniden yazmayı önleyin ^(.*)(?<!\.axd)$ veya ^(?!.*\.axd$)(.*)$
Yes /resource.htm
Eşleşen /resource.axd
rewritten/$1
/rewritten/resource.htm
/resource.axd
URL segmentlerini yeniden Düzenle path/(.*)/(.*)/(.*)
path/1/2/3
path/$3/$2/$1
path/3/2/1
URL segmentini değiştirme ^(.*)/segment2/(.*)
/segment1/segment2/segment3
$1/replaced/$2
/segment1/replaced/segment3

Ek kaynaklar