Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.
0

ASP.NET ile sanal / dinamik subdomain oluşturma

PHP'de bir çok basit yolu anlatılmış olan konuların subdomain olarak gösterilmesi ASP.NET ile mümkün mü?

Diğer bir deyişle sanal subdomainler kullanacağım. Örneğin:

example.com alan adı için.
ali.example.com
hasan.example.com
konu1.example.com

Soran:23.02.17 21:34
misafir  
Bunu ben de yapacağım. Yabancı sitelerde birşeyler anlatılmış. Ama denemediğimden bir cevap olarak yazamıyorum. Eğer yaparsam buraya cevabını yazarım. →  cevapsitesi 24.02.17 01:06

1 Cevap

0
Bunun MVC kullanılarak yapıldığıyla ilgili bir çok konu geziniyor İnternette. Ama web forms ile nasıl yapacağımız hakkında pek bilgi yok. Bu soru üzerine biraz bakındım ve bir yol buldum. Ama bu yöntem için IIS yöneticisine erişebiliyor olmanız lazım. Eğer bir kök veya sanal makineniz varsa yapabilirsiniz. Bunun haricinde hosting firmasından yardım istemeniz gerekebilir.

Bir de şunu söylemem lazım. Bu işleri IIS ve DNS ile yapacağımızdan dikkatli olmalısınız. Hata yaparsanız bazı alan adlarınız veya subdomainleriniz çalışmayabilir. Ayrıca bunu kendim denedim oldu fakat sizde olacağının bir garantisini veremem.

Birincisi DNS kayıtlarına girip siteniz için bir A kaydı oluşturun. Kayıtta Domain Name kısmına alan adınızın example.com olduğunu varsayarsak *.example.com girmeniz gerekiyor. Tabi sitenizin IP adresi de girilecek.

İkincisi IIS Manager'ı açıp Sites düğümünden sitenizi bulup tıklayın. Sağ taraftaki Actions panelinde Edit Site bölümünün altındaki Bindings... seçeneğini açın. Liste açıldığında Add tuşunu tıklayın. Açılan penceredeki Type listesinden http'yi, IP address listesinden IP adresinizi seçin. Port 80 kalsın. Host name kısmına birşey yazmayın, Boş bırakın (Aksi halde yazdığınız alan adı ile isteklerdeki alan adları eşleşmeyebilir).  Ok ile kaydedin. Eğer https kullanıyorsanız bu işlemin aynısını Type listesinden https'yi seçerek tekrarlayın.

Artık bundan sonra sunucuda subdomain olarak kayıtlı olanların haricindeki bütün subdomain adı bulunan istekler sitenize varsa Path ve Query String'i de içeren bir adresle gelecektir.

Sitenize yapılan istekleri Global.asax içinde yakalayarak ve / veya routing kullanarak gelen alt alan adına göre işlem yapabilirsiniz. Ya da routing kullanmak istemezseniz sayfalarınızda istek adresinin subdomain kısmını okuyarak da işlem yapılabilir.

Ek:

Kullanırken ortaya çıkan bir durumu ekleyeyim. Bindings kısmında ismi boş bırakarak her IP için sadece bir tane web sitesine tanımlama yapılabiliyor. Ancak IIS 10 kullanıyorsanız Wildcard subdomain kullanılabiliyor. Yani Bindings tanımlarken boş bıraktığımız Host Name kısmına *.example.com gibi bir adres girebiliyoruz. Dolayısıyla aynı IP'de çalışan siteler için ayrı ayrı bu işlemi yapabiliyoruz.

Ek 2:

Yine kullanırken ortaya çıkan bir durum: IIS 10 kullanıp da birinci ektekini yapmıyorsanız veya yapamıyorsanız, sunucuda aynı IP adresini kullanan sitelere yapılan mevcut olmayan subdomain adı bulunan istekler de ilgili siteye yönlendiriliyor ve dolayısıyla adres çubuğunda yanlış adres görülüyor.

Örneğin bu işlemleri example.com için yapmışsanız ve aynı IP numarasını kullanan example.net adresiyle farklı bir site aynı sunucuda yayındaysa blog.example.net şeklinde bir istek example.com'a yönlendiriliyor ve adres blog.example.net şeklinde görülüyor.

Bunun için benim çözümüm, Global.asax dosyasındaki Application_BeginRequest olayında 301 yönlendirmesi yapmak.

    void Application_BeginRequest(Object o, EventArgs e)
    {
        HttpRequest istek = HttpContext.Current.Request;
        HttpResponse cevap = HttpContext.Current.Response;
        string host = istek.Url.Host;
        if (host.IndexOf("example.com") == -1)
        {
            // Alttaki subdomain çözümlemesi alan adı com.tr gibi bitiyorsa veya
            // alt alan adı ali.blog.example.com gibiyse geçersizdir.
            // Basit olduğu için burada kullanıyorum. Başka bir yol kullanın.
            string sub = "";
            string[] parts = host.Split(new char[] { '.' });
            if (parts.Length > 2) sub = parts[0] + ".";
            cevap.Status = "301 Moved Permanently";
            cevap.StatusCode = 301;
            cevap.AddHeader("Location",
                       sub + "example.com" + istek.RawUrl);
            cevap.End();
        }
    }

Başka bir fikri olan varsa ve burada paylaşırsa faydalı olabilir.



Cevaplayan: 25.02.17 21:04
cevapsitesi
102,034p 15ü