PDA

View Full Version : حرفه ای: خواندن قسمتی از URL



Ali_M.Eghbaldar
چهارشنبه 18 خرداد 1390, 22:03 عصر
با سلام.

سایتی داریم با دامین www.test.com (http://www.test.com)
چطوری اگر کاربر در آدرس بار بصورت www.test.com/ (http://www.test.com/)user وارد کرد عبارت user جایی ذخیره شه ؟

اگر از دستورات کلاس Request.Url استفاده کنیم , هیچکدام از دستوراتش عبارت user بر نمی گرداند
ولی کلاس Rrquest.UrlReferrer این کارو میکنه ولی مشکلی که پیش میاد اینکه این کلاس (UrlReferrer) موقعی URL می خونه که صفحه کامل لود شده باشه این در صورتیه که من می خوام این دستور در Applicatiob_BeginRequest بنویسم که با خطا مواجه می شم ؟؟؟؟ :اشتباه:

کلیات کارم:
می خوام وقتی کاربر بصورت : www.test.com/user (http://www.test.com/user) آدرسی نوشت به صفحه ی www.test.com/username/ (http://www.test.com/username/)user هدایت بشه اگه دوستان راهکار بهتری را سراغ دارن لطفا راهنمایی کنن :لبخندساده:

Alghoochi
پنج شنبه 19 خرداد 1390, 00:29 صبح
Context.Request.Url.AbsolutePath آدرس صفحه بدون دامنه رو برات برمی‌گردونه.
بهتره آدرس‌ها رو بازنویسی کنی. ساده‌تر بگم یعنی وقتی کاربر آدرس test.com/user.aspx رو وارد کرد اطلاعات صفحه‌ای دیگه مثلا test.com/userinfo.aspx?userid=user برای کاربر نشون داده بشه. کاربر آدرس صفحه‌ اصلی رو متوجه نمی‌شه.
درمورد بازنویسی آدرس صفحات وب تو همین سایت به حد کافی توضیح داده شده فقط زحمت گشتنش باخودت.

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 11:33 صبح
ممنونم Alghoochi (http://barnamenevis.org/member.php?105791-Alghoochi)عزیز :لبخندساده:
من نمی خواستم از UrlRewritie حل بشه !!
دستور زیر که نوشتم تو Local کاملا جواب میده ولی وقتی Upload میکنم صفحه
The page cannot be found

بالا میاد !!!!!!!!!!!!!! :عصبانی::اشتباه:
یعنی باید سرویسی فعال بشه ؟؟؟؟؟

Dim s As String = Request.RawUrl.ToString().ToLower.Replace("http://www.localhost:4700/test", "").Replace("/test", "")
If s.Split("/").Length - 1 = 1 Then
Dim s2 As String = s.Substring(1, s.Length - 1)
If Not s2.Contains(".") Then
Response.Redirect("~/default.aspx?name=" + s2)
End If
End If

دوستان کسی میتونه کمکی کنه ؟

raziee
پنج شنبه 19 خرداد 1390, 12:15 عصر
ممنونم Alghoochi (http://barnamenevis.org/member.php?105791-Alghoochi)عزیز :لبخندساده:
من نمی خواستم از UrlRewritie حل بشه !!
دستور زیر که نوشتم تو Local کاملا جواب میده ولی وقتی Upload میکنم صفحه
The page cannot be found

بالا میاد !!!!!!!!!!!!!! :عصبانی::اشتباه:
یعنی باید سرویسی فعال بشه ؟؟؟؟؟

Dim s As String = Request.RawUrl.ToString().ToLower.Replace("http://www.localhost:4700/test", "").Replace("/test", "")
If s.Split("/").Length - 1 = 1 Then
Dim s2 As String = s.Substring(1, s.Length - 1)
If Not s2.Contains(".") Then
Response.Redirect("~/default.aspx?name=" + s2)
End If
End If

دوستان کسی میتونه کمکی کنه ؟

دوست من طبیعی هست که وقتی فایلی به صورت فیزیکی موجود نباشه و اون فایل درخواست بشه خطای cannot be found رخ خواهد داد.
برای حل این موضوع باید از UrlRewriting استفاده کنید.

شما هم درواقع دارید عمل UrlRewriting تا حدودی پیاده میکنید.
یعنی اگه به جای Response.Redirect از HttpContext.Current.RewritePath استفاده کنید عمل UrlRewriting رو پیاده کردید.

برای بدست آوردن مسیر فایل درخواست شده از دستور زیر استفاده کنید.
Request.Url.LocalPath.ToLower()

یادتون باشه که اگه از سروری استفاده میکنید که ورژن فریمورکش کم تر از 4 باشه حتما باید از پسوند aspx استفاده کنید در غیر این صورت خطا خواهید داشت.
این موضوع در فریم ورک 4 مشکلی پیش نمی آورد.
برای رفع این مشکل در نسخه 3.5 به پاین باید از isapirewrite استفاده کنید.
شاد باشید.

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 12:37 عصر
خیلی ممنونم :لبخندساده:
آخه پس چرا تو لوکال خطا ندارم ؟؟
من بجای دستور Response.Redirect از HttpContext.Current.RewritePath استفاده کردم ولی اتفاقی نیفتاد , یعنی تو همون صفحه موندم ؟؟!! :افسرده:

Alghoochi
پنج شنبه 19 خرداد 1390, 13:18 عصر
دوست عزیز پیکربندی IIS در لوکال و سرور با هم متفاوت است. من خودم از Context.RewirtePath استفاده می‌کنم جواب هم می‌ده. کد‌ها را در فایل Global.asax و در سابروتین BeginRequest استفاده کنی.

raziee
پنج شنبه 19 خرداد 1390, 13:22 عصر
آخه پس چرا تو لوکال خطا ندارم ؟؟


به خاطر اینکه در Local کل درخواست ها رو میشه مدیریت کرد اما در یرور اینگونه نیست. تنها درخواست های مجاز(پسوند های مجاز) به Application فرستاده میشه.

من بجای دستور Response.Redirect از HttpContext.Current.RewritePath استفاده کردم ولی اتفاقی نیفتاد , یعنی تو همون صفحه موندم ؟؟!!
خوب شما داری Rewrite میکنی دیگه برادر.
یعنی کاربر آدرس A رو درخواست میکنه اما در Application اون رو با آدرس B تعویض میکنیم بدون این که کاربر متوجه این تغییر بشه.

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 13:49 عصر
raziee (http://barnamenevis.org/member.php?95909-raziee) جان واقعا دمت گرم


یعنی کاربر آدرس A رو درخواست میکنه اما در Application اون رو با آدرس B تعویض میکنیم بدون این که کاربر متوجه این تغییر بشه.

بله . حواسم نبود ... درست کار کرد تو لوکال .. ممنون

وای باز هم وقتی upload کردم
The page cannot be found

میده !!!! دیگه چرا ؟:گریه:

یه نگاهی به دستورات بکنید لطفا :

Dim s As String = Request.RawUrl.ToString().ToLower.Replace("http://www.test.com", "").Replace("www.test.com", "").Replace("test.com", "")
Response.Write(s)
If s.Split("/").Length - 1 = 1 Then
Dim s2 As String = s.Substring(1, s.Length - 1)
If Not s2.Contains(".") Then
HttpContext.Current.RewritePath("~/default2.aspx?name=" + s2)
End If
End If

raziee
پنج شنبه 19 خرداد 1390, 14:24 عصر
raziee (http://barnamenevis.org/member.php?95909-raziee) جان واقعا دمت گرم



بله . حواسم نبود ... درست کار کرد تو لوکال .. ممنون

وای باز هم وقتی upload کردم
The page cannot be found

میده !!!! دیگه چرا ؟:گریه:

یه نگاهی به دستورات بکنید لطفا :

Dim s As String = Request.RawUrl.ToString().ToLower.Replace("http://www.test.com", "").Replace("www.test.com", "").Replace("test.com", "")
Response.Write(s)
If s.Split("/").Length - 1 = 1 Then
Dim s2 As String = s.Substring(1, s.Length - 1)
If Not s2.Contains(".") Then
HttpContext.Current.RewritePath("~/default2.aspx?name=" + s2)
End If
End If

این چه کدی که نوشتی برادر؟؟؟

به این شیوه کار کن:
protected void Application_BeginRequest(object sender, EventArgs e)
{
string lookFor = "/user/(.[A-Za-z0-9_]*)";
string sendTo = "/Default.aspx?user=$1";
string requestedPath = Request.Url.LocalPath;
Match objMatch = Regex.Match(requestedPath, lookFor, RegexOptions.IgnoreCase);
if ((objMatch.Success))
{
string newUrl = Regex.Replace(requestedPath, lookFor, sendTo, RegexOptions.IgnoreCase);

HttpContext.Current.RewritePath(newUrl);
}
}

کد ها واضح هستند اما اگه سوالی داشتی بپرس
یک نمونه برات نوشتم:
70936

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 15:05 عصر
سلام .. دیگه شرمده :افسرده::عصبانی++:
از دستورات شما بصورت زیر استفاده کردم باز توی لوکال درست کار کرد ولی توی هاست نه !!
یعنی لحظه اول که Www.test.com لود میشه عمل میکنه و به Default2.aspx میره ولی اگه دستی بنویسم www.test.com/ali دوباره Can't page میده :گریه:

Dim lookFor As String = "(.[A-Za-z0-9_]*)"
Dim sendTo As String = "default2.aspx?name=$1"
Dim requestedPath As String = Request.RawUrl
Dim objMatch As Match = Regex.Match(requestedPath, lookFor, RegexOptions.IgnoreCase)
If (objMatch.Success) Then
Dim newUrl As String = Regex.Replace(requestedPath, lookFor, sendTo, RegexOptions.IgnoreCase)
HttpContext.Current.RewritePath(newUrl)
End If

raziee
پنج شنبه 19 خرداد 1390, 15:17 عصر
سلام .. دیگه شرمده :افسرده::عصبانی++:
از دستورات شما بصورت زیر استفاده کردم باز توی لوکال درست کار کرد ولی توی هاست نه !!
یعنی لحظه اول که Www.test.com لود میشه عمل میکنه و به Default2.aspx میره ولی اگه دستی بنویسم www.test.com/ali دوباره Can't page میده :گریه:

Dim lookFor As String = "(.[A-Za-z0-9_]*)"
Dim sendTo As String = "default2.aspx?name=$1"
Dim requestedPath As String = Request.RawUrl
Dim objMatch As Match = Regex.Match(requestedPath, lookFor, RegexOptions.IgnoreCase)
If (objMatch.Success) Then
Dim newUrl As String = Regex.Replace(requestedPath, lookFor, sendTo, RegexOptions.IgnoreCase)
HttpContext.Current.RewritePath(newUrl)
End If

مشخصات سرور رو بنوسید. (نسخه Framework)
RegEx Pattern رو به شکل زیر تغییر بدید.


/(.[A-Za-z0-9_]*)

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 15:29 عصر
دوست من عوض کردم توی کل ماجرا تاثیری نداشت ولی خروجی قبلیو مرتب تر کرد.
همچنان صفحه اولو منتقل میکنه ولی بازم اگه تایپ شه : www.test.com/ali همون خطارو میده .:اشتباه:

ورژن ASP.Net v.3.5

raziee
پنج شنبه 19 خرداد 1390, 15:36 عصر
دوست من عوض کردم توی کل ماجرا تاثیری نداشت ولی خروجی قبلیو مرتب تر کرد.
همچنان صفحه اولو منتقل میکنه ولی بازم اگه تایپ شه : www.test.com/ali همون خطارو میده .:اشتباه:

ورژن ASP.Net v.3.5

دوست من به نوشته های قبلی بیشتر دقت کن.
مشکلت و راه حلش رو در پست 4 گفته بودم.

یادتون باشه که اگه از سروری استفاده میکنید که ورژن فریمورکش کم تر از 4 باشه حتما باید از پسوند aspx استفاده کنید در غیر این صورت خطا خواهید داشت.
این موضوع در فریم ورک 4 مشکلی پیش نمی آورد.
برای رفع این مشکل در نسخه 3.5 به پاین باید از isapirewrite استفاده کنید.

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 15:46 عصر
خونده بودم منظورتون کجاست ؟ کجا باید ازaspx استفاده می کردم که نکردم ؟؟ :متعجب::افسرده:

raziee
پنج شنبه 19 خرداد 1390, 15:55 عصر
خونده بودم منظورتون کجاست ؟ کجا باید ازaspx استفاده می کردم که نکردم ؟؟ :متعجب::افسرده:

string lookFor = "/user/(.[A-Za-z0-9_]*).aspx";
string sendTo = "/Default.aspx?user=$1";
string requestedPath = Request.Url.LocalPath;
Match objMatch = Regex.Match(requestedPath, lookFor, RegexOptions.IgnoreCase);
if ((objMatch.Success))
{
string newUrl = Regex.Replace(requestedPath, lookFor, sendTo, RegexOptions.IgnoreCase);

HttpContext.Current.RewritePath(newUrl);
}

<a href="/user/raziee.aspx">Raziee</a><br />
<a href="/user/hossein.aspx">Hossein</a><br />
<a href="/user/hossein_raziee.aspx">Hossein Raziee</a>

Ali_M.Eghbaldar
پنج شنبه 19 خرداد 1390, 16:18 عصر
واقعا از صبروشکیباییت ممنونم
الان وقتی می نویسم www.test.com/ali.aspx (http://www.test.com/ali.aspx) می فهمه و به صفحه ای که می خوام میره ولی اینطوری نمیشه نوشت www.test.com/ali (http://www.test.com/ali) برای این نمیشه کاری یعنی؟

چون کاربر عادی که زیاد با پسوند ها آشنا نیست !!!

raziee
پنج شنبه 19 خرداد 1390, 16:39 عصر
واقعا از صبروشکیباییت ممنونم
الان وقتی می نویسم www.test.com/ali.aspx (http://www.test.com/ali.aspx) می فهمه و به صفحه ای که می خوام میره ولی اینطوری نمیشه نوشت www.test.com/ali (http://www.test.com/ali) برای این نمیشه کاری یعنی؟

چون کاربر عادی که زیاد با پسوند ها آشنا نیست !!!

البته که میشه. کار که نشد نداره. فقط باید دسترسی به سرور داشته باشید.

یادتون باشه که اگه از سروری استفاده میکنید که ورژن فریمورکش کم تر از 4 باشه حتما باید از پسوند aspx استفاده کنید در غیر این صورت خطا خواهید داشت.
این موضوع در فریم ورک 4 مشکلی پیش نمی آورد.
برای رفع این مشکل در نسخه 3.5 به پاین باید از isapirewrite استفاده کنید.

در موردisapirewrite تحقیق کنید.