2009-06-23 15 views
21

कुछ .NET संचालित साइटों पर URL एएसपीनेट पेज नामों के साथ समाप्त नहीं होते हैं, जैसे default.aspx, इसके बजाय वे पैटर्न http://sitename.com या http://sitename.com/subdirectory/subdirectory का उपयोग करते हैं। साइट रूट से उप निर्देशिका के रूप में मैप किया गया है, यानी।/टैग,/उपयोगकर्ता,/बैज, यूआरएल क्रमशः/टैग,/उपयोगकर्ता,/बैज होंगे।स्टैक ओवरफ़्लो जैसे क्लीन यूआरएल कैसे प्राप्त करें?

एक विशिष्ट उदाहरण का उपयोग करने के लिए स्टैक ओवरफ़्लो, How do get clean URLs like Stackoverflow? फ़ॉर्म के प्रश्न URL का उपयोग करता है। खोज इंजन के लिए पृष्ठ को अनुकूलित करने का एक शानदार तरीका कौन सा है।

क्या यह HTTP हैंडलर का उपयोग करके लागू किया गया है? क्या जीईटी अनुरोध पथ के आधार पर फ़िल्टर किया गया है और प्रश्न आईडी के आधार पर हैंडलर में पूरी प्रतिक्रिया बनाई गई है? किसी और को अनुमान लगाने की परवाह है?

+4

इस प्रश्न को कई बार पहले पूछा गया है। –

+0

मैं एएसपी.नेट एमवीसी फ्रेमवर्क का उपयोग करके बेलीव स्टैक ओवरफ्लो बनाया गया है, www.asp.net/mvc – Charlie

+5

देखें SO संदर्भों को छोड़ दें और यह एक अच्छा सवाल है। –

उत्तर

21

यह ASP.Net MVC, जो अधिक या कम में बनाया गया। रूटिंग के साथ-साथ गैर MVC परियोजनाओं के लिए उपलब्ध है नेट रूटिंग है, हालांकि

http://msdn.microsoft.com/en-us/library/cc668201.aspx

यह सिर्फ एक .dll आप कर सकते हैं क्या है अपने बिन फ़ोल्डर में ड्रॉप करें। असल में यह आपके यूआरएल के पृष्ठों/टेम्पलेट्स से मेल खाने के लिए नियमित अभिव्यक्तियों का उपयोग करता है।

+1

एएसपी.नेट 4.0 के रूप में, वेब फॉर्म के लिए बेहतर यूआरएल रूटिंग एकीकरण उपलब्ध है, जो 200 9 के अंत में घोषित किया गया था: [एएसपी.नेट 4 वेब फॉर्म (वीएस 2010 और .NET 4.0 सीरीज) के साथ यूआरएल रूटिंग - स्कॉटगू का ब्लॉग] (http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx) – Lumi

18

यह अपाचे में mod_rewrite, या url_rewriting on IIS के समान तरीकों से प्राप्त किया गया है।

नोट: SOFlow उत्तरार्द्ध का उपयोग करता है।

+2

डाउन-वोट क्यों? – Sampson

+0

शायद क्योंकि यह अच्छी तरह से प्रलेखित है कि साइट अपाचे का उपयोग नहीं करती है। –

+7

क्या मैंने कहा कि यह अपाचे का उपयोग करता है? नहीं। प्रश्नकर्ता को यूआरएल के काम में दिलचस्पी थी। उन्होंने यह निर्दिष्ट नहीं किया कि वह रुचि रखते थे कि वे .NET परिप्रेक्ष्य से कैसे काम करते हैं। मैंने अपाचे और आईआईएस दोनों के लिए एक जवाब दिया। – Sampson

3

मुझे पता है कि स्टैक ओवरफ़्लो एएसपी.नेट एमवीसी ढांचे का उपयोग कर रहा है, जो संभवतः एक यूआरएल पुनर्लेखन प्रणाली अंतर्निहित है। गैर-विंडोज सिस्टम के लिए, अपाचे mod_rewrite बहुत आम है।

उदाहरण के लिए, विकी पेज: http://server.com/wiki/Main_Page अनुरोध वेबसर्वर द्वारा संभाला जाता है। यह /wiki/index.php?page=Main_Page

में अनुवाद किया है यहाँ अपाचे में पुनर्लेखन URL का एक उदाहरण है: यदि यूआरएल है कि में आता है forum-##.html तो प्रक्रिया है कि अनुरोध कर के रूप में अगर यह forumdisplay.php?fid=## थे

RewriteEngine on 
RewriteRule ^forum-([0-9]+)\.html$ forumdisplay.php?fid=$1 [L,QSA] 
RewriteRule ^forum-([0-9]+)-page-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 [L,QSA] 

RewriteRule ^thread-([0-9]+)\.html$ showthread.php?tid=$1 [L,QSA] 
RewriteRule ^thread-([0-9]+)-page-([0-9]+)\.html$ showthread.php?tid=$1&page=$2 [L,QSA] 

यह क्या कहते है। thread-##.html नियमों के लिए भी यही है।

5

यूआरएल REST principles के बाद उस प्रारूप में हैं जिसमें सब कुछ एक अद्वितीय यूआरएल के साथ संसाधन है।

मुझे लगता है कि मैंने ब्लॉग में कहीं कहीं पढ़ा है कि यह ASP.NET MVC framework का उपयोग कर हासिल किया जाता है।

0

आप इसे Context.RewritePath का उपयोग कर एएसपीनेट में कर सकते हैं।

ग्लोबल.एएसएक्स, Application.BeginRequest ईवेंट हैंडलर बनाएं।

उदाहरण के लिए

, आप

example.com/questions 

का अनुरोध करना चाहते हैं वास्तव में से

example.com/Questions/Default.aspx 

वैश्विक परिणाम वापस।asax:

<%@ Application Language="C#" %> 
<script runat="server"> 

    void Application_BeginRequest(Object sender, EventArgs e) 
    { 
     string originalPath = HttpContext.Current.Request.Path.ToLower(); 

     if (originalPath.Contains("/questions")) 
     { 
      String newPath = originalPath.Replace("/questions", "/Questions/Questions.aspx"); 
      Context.RewritePath(newPath); 
     } 
    } 
</script> 

अपने वेब साइट .NET फ्रेमवर्क 4 से पहले कुछ भी चल रहा है, तो आप मैन्युअल रूप runAllManagedModulesForAllRequestsमें web.config चालू करने के लिए, नहीं तो BeginRequest गतिविधि सक्रिय नहीं किया जाएगा होगा :

<configuration> 
... 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 
संबंधित मुद्दे