Yine blogda yenilikler yapayım derken başıma iş açtım. 2012 yılında blogu açtığımda WordPress ile başlamış, performans sorunları yüzünden 2013 yılında MVC ile kendi yazdığım farklı bir altyapıya taşımış, bakımına vakit ayıramayınca da 2014 yılında tekrar WordPress'e dönmüştüm. Geleneksel blog taşıma zamanım gelmiş olacak ki yine performans ve güvenlik sorunları yüzünden bugün WordPress'i bırakıp BlogEngine.NET'e geçtim.
BlogEngine.NET tamamı açık kaynak,
http://dotnetblogengine.net/ adresinden dağıtılan, ASP.NET 4.0 yapısı üzerine kurulu hazır bir blog altyapısı. Birden fazla blogu tek bir panelde yönetebiliyor olması, aynı anda birden fazla dile destek verebiliyor olması ve tabii ki ASP.NET üzerine kurulu olması tercih etmemdeki ana sebep oldu.
BlogEngine.NET'in kodlarını incelediğinizde ASP.NET ile haşır neşir olanların kolaylıkla anlayıp üzerinde düzenlemeler yapabileceği bir yapı ile karşılaşacaksınız. Ufak tefek eksiklikleri olsa dahi bana göre WordPress'ten çok daha akıcı ve kolay. Ben bu taşıma işlemi sonrasında SQL Server'da duran veritabanımı kullanmak yerine yazılarımı XML olarak saklamayı tercih ettim. Yarın bir gün BlogEngine'den vazgeçersem başıma iş açıp açmayacağını o zaman göreceğiz :)
WordPress'ten BlogEngine.NET'e Geçiş
Önceden Radore'de barındırdığım kiralık sunucumda duran Wordpress'i taşırken BlogEngine'i Azure üzerinde host etmeyi tercih ettim. Bu sayede kurulum birkaç tıklamayla kendiliğinden halloldu. Azure'u BizSpark subscription kredilerimle kullandığım için sınırları zorlamamak adına trafik yükünü azaltması için de daha önceki yazılarımda bahsettiğim
CloudFlare'i kullanarak CDN ve cache sağladım. Bu hem hız artışı sağladı hem de Azure kredilerimin çoğu bana kaldı :)
Kullanıcımı ve ayarlarımı elle taşıdıktan sonra tema üzerindeki değişikliklerimi gerçekleştirdim. Türkçe resource dosyasında eksik kalan bazı keyleri tamamlayıp tamamen Türkçe olmasını sağladım. Fazla kategorim olmadığından bunları da daha güvenli olduğunu düşünerek elle taşımayı seçtim. Yazıları taşımak için de WordPress'in export aracını denedim, fakat işe yaramadı.
Biraz araştırmadan sonra WordPress'in export bölümünü değiştiren bir yamayla karşılaştım.
Buradan indirebileceğiniz export.php dosyasını wp-admin klasörünüze attıktan sonra export işlemini yaptığınızda çıkan dosyayı BlogEngine.NET panelinden direkt import edebiliyorsunuz. Ben kategorileri elle taşımayı seçtiğim için tam bir eşleşme sağlanmadı, bunu sonrasında elle düzeltmek zorunda kaldım fakat kendi eklediğim kategorilerin guidlerini değiştirmek fazla vakit almadı.
WordPress'te en büyük baş belam olan spam yorumlardan artık kurtulmak istedim. BlogEngine'de ne denli spam gelirdi bilemiyorum ama bunu göze almayı dahi istemedim. Eski sitemdeki tüm WordPress yorumlarını bu amaçla feda ettim. Bunun yerine Facebook Comments widget kullanmak istedim. Bunun için themes\Standard klasörü altındaki CommentView.ascx dosyasını kendime göre modifiye ettim. CommentView.ascx dosyasının modifiye halini
buradan indirebilirsiniz. WordPress yorumlarını gözden çıkarsam da en azından önceki blogdaki Facebook yorumlarının kalması için buraya bir koşul ekleyip 3 Nisan 2015'ten önce girilen yorumlar için blog.mertsarac.com adresinin korunmasını sağladım. Zaten bu yazı ve bundan önceki yazıların kaynak kodlarını kıyaslarsanız aradaki farkı görebilirsiniz.
301 Redirection
Taşıma işleminin en yorucu kısmı burası oldu diyebilirim. 301 Redirection'ı kısaca açıklamak gerekirse, WordPress ve BlogEngine farklı url yapılandırmaları kullandığı için aynı slug kullanılsa dahi url değişmiş olacağından eski yazılarınız HTTP 404 - Not Found uyarısı vermeye başlıyor. Bu da Google arama sonuçlarındaki sıranızı alt üst ediyor. Bu sayfaların 404 vermek yerine 301 HTTP koduyla içeriğin yeni adresine redirect yapıyor olması GoogleBot ve diğer arama motoru botlarının sayfanın farklı bir adrese taşındığı bilgisine erişmesini sağlıyor. Bu da arama sonuçlarınızın korunmasını sağlıyor.
Ben bu işlemi yapabilmek için IIS'in URL Rewriter altyapısını kullanmayı seçtim. Önceden http://blog.mertsarac.com/tr-tr/arduino-ile-c-sharp-haberlesmesi/ formatında olan urllerimi http://www.mertsarac.com/blog/arduino-ile-c-sharp-haberlesmesi formatına çevirmek için yeni bir ASP.NET projesi oluşturup Web.config dosyasındaki system.webServer parametresinin altına aşağıdaki rewrite rule'ları yazdım.
<rewrite>
<rules>
<rule name="PostRewrite" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/Default.aspx?lang={R:1}&aspxerrorpath={R:2}" />
</rule>
<rule name="ArchiveRewrite" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/Default.aspx?lang={R:1}&year={R:2}&month={R:3}" />
</rule>
<rule name="PageRewrite" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/Default.aspx?lang={R:1}&param={R:2}&page={R:3}" />
</rule>
</rules>
</rewrite>
Burada gördüğünüz gibi 3 farklı rule var ve bu rule'lar Default.aspx dosyasına geliyor. Ben de Default.aspx dosyasında gelen url'e göre sınıflara ayırıp 301 ya da 404 koduyla redirection işlemini sağlıyorum. Bu kodu da aşağıda görebilirsiniz.
string newLocation = String.Empty;
int StatusCode = 0;
string aspxerrorpath = Request.QueryString["aspxerrorpath"];
string year = Request.QueryString["year"];
string month = Request.QueryString["month"];
string page = Request.QueryString["page"];
if (String.IsNullOrEmpty(aspxerrorpath))
{
newLocation = "http://www.mertsarac.com/blog/";
StatusCode = 404;
}
else if (!String.IsNullOrEmpty(year) && !String.IsNullOrEmpty(month))
{
newLocation = String.Format("http://www.mertsarac.com/blog/{0}/{1}/default", year, month);
StatusCode = 301;
}
else if (!String.IsNullOrEmpty(page))
{
newLocation = String.Format("http://www.mertsarac.com/blog/?page={0}", page);
StatusCode = 301;
}
else
{
if (aspxerrorpath == "/Default.aspx")
{
newLocation = String.Format("http://www.mertsarac.com/blog/");
StatusCode = 404;
}
else
{
newLocation = String.Format("http://www.mertsarac.com/blog/post/{0}", aspxerrorpath);
StatusCode = 301;
}
}
Response.Redirect(newLocation, false);
Response.StatusCode = StatusCode;
Response.End();
Tüm bunları yaptıktan sonra yapmanız gereken bir diğer şey de robots.txt dosyasındaki alan adını sitenize göre değiştirerek sitemap dosyasının adresini vermek. Aynı zamanda bu sitemap dosyasını Google Webmasters'a da belirtirseniz taşıma işlemini çok daha sorunsuz atlatabilirsiniz.
Benim için bu geçişin tamamını sağlamanın 3 saat kadar sürdüğünü belirtmekte fayda var.
BlogEngine konusunda henüz çok fazla yorum yapabilecek durumda değilim. Ancak birkaç ay içinde pek çok artı ve eksisini gördükten sonra bunu da farklı bir yazıda anlatmayı planlıyorum.
Faydalı olması dileğiyle.