PDA

View Full Version : rewrite کردن آدرس صفحه



morteza_mokhtari
سه شنبه 05 فروردین 1393, 21:16 عصر
سلام دوستان
بنده یک وب سایت چند زبانه درست کردم.میخوام وقتی کاربر آدرس www.example.ir (http://www.example.ir) رو تویه مرورگرش باز کرد تبدیل بشه به www.example.ir/fa/home.html (http://www.example.ir/fa/home.html)
ممنونم میشم راهنمایی کنید؟ با تشکر
خودم از کد زیر استفاده میکنم ولی نمیدونم چرا جواب نمیده و میفته تویه حلقه و دامنه به این صورت میشه www.example.ir/fa/home.html/fa/home.html/fa (http://www.example.ir/fa/home.html/fa/home.html/fa)....



Uri requestedUrl = HttpContext.Current.Request.Url;

if (requestedUrl.ToString() == "http://" + requestedUrl.Host)
{

HttpContext.Current.Response.Status = "301 Moved Permanently";

HttpContext.Current.Response.AddHeader("Location", requestedUrl+ "/fa/home.html");
}

mRizvandi
چهارشنبه 06 فروردین 1393, 01:36 صبح
به جای AddHeader از Response.Redirect استفاده کنید

morteza_mokhtari
پنج شنبه 07 فروردین 1393, 13:55 عصر
کل کدی که استفاده میکنم اینه که میفته تویه حلقه و هر باز عبارت /fa/home.html به آدرس صفحه اضافه میشه.


Uri requestedUrl = HttpContext.Current.Request.Url;


if (!requestedUrl.ToString().Contains("http://www"))
{
if (requestedUrl.ToString() == "http://" + requestedUrl.Host)
{

HttpContext.Current.Response.Status = "301 Moved Permanently";

HttpContext.Current.Response.Redirect(requestedUrl .ToString().Replace("http://", "http://www.") + "/fa/home.html");
}
else
{
HttpContext.Current.Response.Status = "301 Moved Permanently";

HttpContext.Current.Response.Redirect(requestedUrl .ToString().Replace("http://", "http://www."));
}

}
else
{
if (requestedUrl.ToString() == "http://" + requestedUrl.Host)
{

HttpContext.Current.Response.Status = "301 Moved Permanently";

HttpContext.Current.Response.Redirect( requestedUrl + "/fa/home.html");
}
}



ببنید من میخوام وقتی کاربر آدرس example.ir رو تویه مرورگرش باز کرد آدرس تبدیل به www.example.ir/fa/home.html باز بشه.اگر کاربر عبارت www.example.ir رو زد باز هم عبارت www.example.ir/fa/home.html باز شود.ممنون میشم راهنمایی کنید.با تشکر

mRizvandi
پنج شنبه 07 فروردین 1393, 21:06 عصر
دوست عزیز من بر اساس اولین کدی که داده بودید یک پروژه تستی ساخته بودم، بعد از اولین اجرای دیدم که لوپ شده و البته به تعداد مشخصی اون آدرس تکرار شده
بعدش سعی کردم کد رو اصلاح کنم که با ریدایرکت به جواب میرسه، اما یه اشکال عجیب و غریب رخ داده و اونم اینه که هر زمان، حتی بعد از پاک کردن کش مرورگر، یا پاک کردن کش asp.net وقتی آدرس رو میزنم بعد عنوان صفحه، آدرس لوپ شده رو نمایش میده! و جالب اینجاست که هیچکدوم از رخدادهای Session یا Request هم اتفاق نمی افته، بعد از کلی تست و پیگیری و پاک کردن فایل و ... به این نتیجه رسیدم که از مرورگر دیگه ای برای تست استفاده کنم و همه چیز درست بود.
این رو گفتم شاید شما هم روی لوکال همون اشکال رو داشته باشید.
به نظرم کدهاتون صحیح هست. فقط با مرورگر دیگه ای تست کنید.
اگر هم آپلود کردید پیشنهاد می کنم لاگ بزنید، توی هر ریکوستی که اتفاق می افته پارامترهای خاص مدنظرتون رو لاگ بزنید و بعد فایل رو بررسی کنید ببنید چه چیزی توی فایل هست.
راستی شما این کدها رو کجا نوشتی؟ (کدوم رویداد)

morteza_mokhtari
پنج شنبه 07 فروردین 1393, 22:30 عصر
سلام دوست عزیز ممنون از پاسختون
بنده اصلا رویه لوکال تست نکردم چون جواب نمیده.فکر کنم ماله port باشه که داخل url هست.بنده سایت رو آپلود کردم.که مشکل داره متاسفانه.خیلی بهش ور رفتم ولی هرکاری میکنم نمیشه.دوست عزیز شما کاری به کد بالا نداشته باشید روش دیگه میتونید بهم پیشنهاد دهید. کدها رو تویه رویداد Application_BeginRequest قرار دادم.

morteza_mokhtari
پنج شنبه 07 فروردین 1393, 22:38 عصر
دوست عزیز بنده با این سایت http://redirectcheck.koeniglich.ch/ که تست میکنم برای آدرس example.ir کد 302 برمیگردونه و برای www.example.ir کد 200 . پس احتمالا یه قسمت کد باید مشکل داشته باشه.برای آدرس example.ir/fa/home.html کد 302 و برای www.example.ir/fa/home.html کد 200.با این اوصاف احتمالا این قسمت if (requestedUrl.ToString() == "http://" + requestedUrl.Host) باید مشکل داشته باشه.ممنون میشم اگر وقت دارید راهنمایی کنید.با تشکر

anotheruser
پنج شنبه 07 فروردین 1393, 22:49 عصر
سلام دوست عزیز ممنون از پاسختون
بنده اصلا رویه لوکال تست نکردم چون جواب نمیده.فکر کنم ماله port باشه که داخل url هست.بنده سایت رو آپلود کردم.که مشکل داره متاسفانه.خیلی بهش ور رفتم ولی هرکاری میکنم نمیشه.دوست عزیز شما کاری به کد بالا نداشته باشید روش دیگه میتونید بهم پیشنهاد دهید. کدها رو تویه رویداد Application_BeginRequest قرار دادم.

سلام
دوست من این کاری که شما می خواین انجام بدین Redirect هست و با UrlRewrite زمین تا آسمون فرق داره (اشاره به عنوان تاپیکتون) ، برا ریدایرکت نیازی تیست داخل Application_BeginRequest کدتون رو بنویسین ، کافیه به سادگی با یک خط کد Response.Redirect درون رویداد Page_Load فایل پیش فرض اون رو به آدرس مورد نظر هدایت بکنین ، بعد هم نمیدونم وقتی متد خاصی برا این کار هست چرا هدر رو مستقیما اضافه می کنین ،

mRizvandi
جمعه 08 فروردین 1393, 11:15 صبح
البته منم فکر می کنم پیشنهاد دوستمون هم روش خوبی باشه، کافیه یک صفحه با نام Default.aspx بسازید و داخل اون مستقیم ریدارکت کنید.
شاید این کار خیلی بهتر از ریدایرکت کردن در Begin_Request باشه، دلیلش هم اینه که Begin_Request به ازای هر درخواستی فراخوانی میشه، حالا می خواد همین مسیر مورد نظر باشه یا هر فایل و صفحه دیگه ای!

این کد مثالی هست که من تست کردم، اسم پروژه ام UrlRewite بوده.
من تست کردم اگر درخواست برای یک صفحه نیست (البته میشه بدون تست کردن هم ادامه داد مثل کدی که شما نوشتید) و اگر طول url درخواست به اندازه 34 کاراکتر هست (طول رو کامل حساب کردم، شما می تونید http:// و http://www. رو هم حذف کنید تا نتیجه بهتری بگیرید) به صفحه لاگین ریدایرکت بشه.


void Application_BeginRequest(object sender, EventArgs e)
{
Uri requestedUrl = HttpContext.Current.Request.Url;

if (requestedUrl.ToString().Substring(requestedUrl.To String().Length - 4) != "aspx")
{
//http://localhost:12345/UrlRewrite = 34 character
if (requestedUrl.ToString().Length == 34 )
HttpContext.Current.Response.Redirect("~/Account/Login.aspx");
}
}


اگر قرار شد که پیشنهاد دوستمون رو انجام بدی، فقط همون خط ریدایرکت رو بذار بدون هیچ کد دیگه ای. (منم همین رو پیشنهاد میدم)

morteza_mokhtari
جمعه 08 فروردین 1393, 12:07 عصر
با تشکر از شما
ببیند سایت بنده الان هم با www و هم بدون www باز میشه.برای جلوگیری از Duplicate content و جریمه شدن سایت توسط موتور های جستجو باید سایت فقد با www یا بدون اون باز بشه.مثلا سایت یا باید با www.example.ir (http://www.example.ir) باز بشه و یا با example.ir .که باید یکی از آنها رو با کد 301 به دامنه ی دیگه انتقال داد.نکته دیگه اینه که ممکنه داخل سایت تعداد زیادی صفحه وجود داشته باشه که اگر بخواهیم تویه page_load این کار رو بکنیم کار اشتباهی هستش بهتری تویه رویداد Begin_Request این کار انجام بشه.فکر کنم استفاده از responce.redirect به این معنی که صفحه مورد نظر موقتا به یک صفحه ای دیگه انتقال داده شده است. که ممکنه تویه سئو سایت تاثیر داشته باشه.بهتره از همون کد 301 استفاده شود.ببیند کدهای بالا دو قسمت هست.یک قسمت اون برای تبدیل دامنه بدون www به دامنه با www که حتما باید تویه رویداد Begin_Request انجام بشه.چون ممکنه تعداد صفخات سایت زیاد باشه.و یه قسمت دیگه اون تبدیل شدن آدرس www.example.ir (http://www.example.ir) به www.example.ir/fa/home.html (http://www.example.ir/fa/home.html) که به نظر میاد تویه رویداد page_load هم میشه این کار رو انجام داد.بنده سعی میکنم تویه رویداد page_laod این کار رو انجام بدم.اگر نشد مشکل رو دوباره مطرح میکنم.ممنون از اینکه وقت گذاشتید.

morteza_mokhtari
جمعه 08 فروردین 1393, 12:22 عصر
کد ها رو دو قسمت کردم کد زیر رو تویه global.asax قرار دادم که کارش تبدیل آدرس بدون www به آدرس با www هست(برای جلوگیری از duplicate content) که این قسمت هیچ مشکلی نداشتم و تویه تمامی سایت هام این کد داره کار میکنه و آدرس با www با میشه.



Uri requestedUrl = HttpContext.Current.Request.Url;
if (!requestedUrl.ToString().Contains("http://www"))
{

HttpContext.Current.Response.Status = "301 Moved Permanently";

HttpContext.Current.Response.AddHeader("Location", requestedUrl.ToString().Replace("http://", "http://www."));

}


میمونه کد تبدیل www.example.ir به www.example.ir/fa/home.html که کد زیر رو تویه page_laod قرار دادم.نمیدونم جواب میده یا نه .باید سایت رو پاپلیش کنم نتیجه اش رو ببینم.



if (requestedUrl.ToString() == "http://" + requestedUrl.Host)
{

HttpContext.Current.Response.Status = "301 Moved Permanently";

HttpContext.Current.Response.AddHeader("Location", requestedUrl + "/fa/home.html");
}

mRizvandi
جمعه 08 فروردین 1393, 13:07 عصر
باز که از AddHeader استفاده کردید :لبخندساده:
وقتی شما از Response.Redirect استفاده می کنید ابتدا به مرورگر کلاینت میگه که داره تغییر مسیر میده و بعد سمت سرور تغییر مسیر میده و مسیر جدید رو برای کلاینت می فرسته!
سئو چیز خوبیه ولی همه چیز رو فدای سئو نکنید.
در خصوص Duplicate Content صحبت شما صحیح هست اما نه در خصوص یک دامین. این موضوع زمانی که دیتاها در دامینهای متفاوتی قرار میگیرند صدق می کنه. زمانی که شما یک متن رو در دو سایت مثل هم دارید و ...
به این لینک هم مراجعه کنید:
http://searchengineland.com/googles-matt-cutts-duplicate-content-wont-hurt-you-unless-it-is-spammy-167459

morteza_mokhtari
جمعه 08 فروردین 1393, 16:03 عصر
http://stackoverflow.com/questions/7618114/301-redirect-for-seo
http://forums.asp.net/t/1356127.aspx?Redirect+Default+aspx+to+to+correct+d uplicate+content+issue
http://moz.com/community/q/duplicate-homepage-www-mysite-com-and-www-mysite-com-default-aspx
http://www.howto301redirect.com/301-redirect-using-asp/
سلام دوست عزیز
نحوه صحیح redirect کردن به همان صورتی است که بنده انجام میدم.که می توانید مطالب بالا رو برای اثبات ادعای من مطالعه کنید.باید دقت بکنید که گوگل بین آدرس های example.ir , www.example.ir (http://www.example.ir) , https://www.example.ir ,https://example.ir تفاوت میذاره.یعنی ممکنه اطلاعات سایت شما با تمامی آدرس هایی که نوشتم اندکس بشه که مشکل duplicate content و جریمه شدن توسط گوگل خواهید شد.حتی بین www.example.ir (http://www.example.ir) , www.example.ir/index.aspx (http://www.example.ir/index.aspx) هم تفاوت هست و باید توسط کد 301 رویه یک آدرس ست شوند.

مشکل بنده حل شد.کد زیر رو تویه قسمت page_load صفحه قرار دادم.


if (!requestedUrl.ToString().ToLower().EndsWith(".html"))
{
HttpContext.Current.Response.RedirectPermanent( requestedUrl.ToString().Replace("/index.aspx", "") + "/fa/home.html");
}


حتما از کد زیر تویه سایتتون در رویداد begin_request استفاده کنید که باعث جریمه سایت توسط گوگل نشوید.البته در بیشتر موقع سایت جریمه نمی شود.بستگی داره که سایت رو با www یا بدون اون به گوگل معرفی کنید.اگر با www و بدون www به گوگل معرفی کنید یا اینکه تویه سایتتون لینک هایی داشته باشید که بعضی هاشون www دارن و بعضی ها ندارن سایت شما حتما جریمه خواهد شد.کد زیر باعث میشه دامنه همیشه با www باز شود.تشکر از شما.




Uri requestedUrl = HttpContext.Current.Request.Url;
if (!requestedUrl.ToString().Contains("http://www"))
{

HttpContext.Current.Response.Status = "301 Moved Permanently";
HttpContext.Current.Response.AddHeader("Location", requestedUrl.ToString().Replace("http://", "http//www.:"));

}