عنوان:

‫آموزش ساخت و کار با subdomain در حالت لوکال هاست


نویسنده: ناصر فرجی
تاریخ: ۱۳۹۱/۱۲/۱۱ ۱۲:۵
آدرس: www.dntips.ir

برای پروژه ای نیاز بود تا از sub-domain استفاده شود. نحوه کار بدین صورت بود که اطلاعات باید بر اساس شهر‌ها بارگذاری می‌شد؛ برای مثال اگر کاربر آدرس tehran.mysite.com را وارد کرد، اطلاعات مربوط به شهر تهران بارگذاری شود و برای سایر شهر‌ها هم به همین ترتیب. در سرور که روش کار و ساخت ساب دومین کاملا مشخص است. اما برای لوکال باید به چه ترتیب عمل شود؟

مسلما برنامه پیش از آپلود حتما باید روی لوکال تست شود. برای ساخت ساب دومین روی لوکال هاست کافی ست به مسیر زیر رفته و فایل hosts را با دسترسی administrator  باز کنید . 

[windows drive]:\Windows\System32\drivers\etc
سپس به شیوه زیر ساب دومین‌های خود را در این فایل وارد کنید .
# localhost name resolution is handled within DNS itself.
127.0.0.1  localhost
127.0.0.1 tehran.localhost
127.0.0.1 mashhad.localhost
127.0.0.1 sabzevar.localhost
خوب، از این به بعد در صورتیکه کاربر هر کدام از ساب دومین‌های وارد شده در این فایل را در مرورگر خود وارد کند، به راحتی می‌توان در رویداد Application_BeginRequest در فایل Gloabal.asax  مسیر url را بدست آورد و کاربر را به مسیر دلخواه هدایت کرد.
نکته مهمی که باید حتما توجه شود استفاده از دستور Request.Url.ToString(); است. هنگامیکه برنامه روی هاست در حال اجراست، قادر به برگرداندن مسیر به همراه با نام ساب دومین می‌باشد، اما این دستور روی لوکال، نام ساب دومین را برنمی‌گرداند! برای این کار روی لوکال استفاده از روش زیر استفاده کنید:
host = Request.Headers["HOST"].ToLower();
اکنون بعد از به دست آوردن مسیر کاربر می‌توانیم او را به مسیر دلخواه بفرستیم. مثلا من ابتدا با به دست آوردن نام شهر از روی url کاربر، کد متناظر با شهر را پیدا کرده و کد را به همراه آدرس به صفحه مورد نظر فرستاده و در آن صفحه با دریافت کد شهر، اطلاعات لازم را از دیتابیس فراخوانی می‌کنم:
void Application_BeginRequest(object sender, EventArgs e)
    {
        string host, url, newUrl;
        host = Request.Headers["HOST"].ToLower();   //for localhost
        //host = Request.Url.ToString();  //  for server
        url = Request.Url.PathAndQuery.ToLower();
        
        if (host.EndsWith(".localhost:8001") && (url == "" || url == "/"))
        {
            int cityId = City.GetCityIdByCityName(host.Replace(".localhost:8001", ""));
            newUrl = string.Format("~/postlist/{0}/", cityId);
            HttpContext.Current.RewritePath(newUrl);
            return;
        }

    }

نکته: در صورتی که در حال استفاده از vpn باشید قادر به دسترسی به subdomain‌های خود در حالت لوکال نخواهید بود. پس برای تست برنامه، حتما این مورد را مد نظر داشته باشید.

موفق باشید.

نظرات

  • مهمان در ۱۳۹۱/۱۲/۱۱ ۱۲:۴۴
    ممنون از آموزشتون
    ولی یه سوال برام پیش اومد و اونم اینکه شما تو فایلhosts  به صورت استاتیک اسامی رو تعریف کردین ولی در عمل بیشتر نیاز به داینامیک بودن این مطلب هست.
    • مهمان در ۱۳۹۱/۱۲/۱۱ ۱۳:۱۹

      IIS ماژولی به نام URL Rewrite برای اینکار داره. با برنامه نویسی هم قابل کنترل است.

    • ناصر فرجی در ۱۳۹۱/۱۲/۱۱ ۱۳:۲۴
      بله. روی لوکال هدف تست برنامه ست.  برای هاست هم در صورتی که بخاید به صورت بی نهایت ساب دومین داشته باشید (شبیه سیستم هایی مثل بلاگفا) باید یک ip اختصاصی داشته باشید و تنظیماتی رو در DNS خودتون اعمال کنید. به این صورت کاربر هر زیر دامنه ای رو روی دامین شما باز کنه به صورت اتوماتیک به وب سایت شما هدایت میشه. در صورتی هم که تعداد ساب دومین هاتون محدوده که میتونید خودتون از طریق کنترل پنل دامنه اون‌ها رو ایجاد کنید.
  • ایمان اسلامی در ۱۳۹۲/۰۹/۲۰ ۲۰:۵۷
    با سلام و تشکر از مطالب شما
    میخواستم بدونم میشه یه پروژه از نوع mvc و یه پروژه از نوع web form رو به صورت subdomain رو iis نصب کرد؟
    در واقع من میخوام cms سایت رو با mvc انجام بدم و خود سایت رو با web from و به صورت ساب دومین مثلاً:
          cms.mysite.com
    mysite.com
    ممنون.
    • محسن خان در ۱۳۹۲/۰۹/۲۰ ۲۱:۱۲
      مشکلی نداره. برای هر کدوم یک application pool جدا درست کنید تا تداخل نداشته باشند.
  • میثم فغفوری در ۱۳۹۲/۱۱/۱۲ ۱۹:۲۳
    ممنون بابت مطلبتون.
    متد Request.Headers["HOST"] بر روی هاست نام ساب دامین‌ها رو برمیگردونه؟ اگر نه چجوری میشه فهمید برنامه به صورت لوکال اجرا شده یا بر روی سرور؟
    • وحید نصیری در ۱۳۹۲/۱۱/۱۲ ۱۹:۲۸
      از خاصیت IsLocal استفاده کنید. پشت صحنه‌ی Host.
  • مهمان در ۱۳۹۲/۱۲/۱۴ ۱۱:۳۳
    سلام.
    من این روش را توی لوکال بدون مشکل انجام دادم
    اما بر روی vps باید چیکار کنم؟
    توی dns رفتم و new alias ساختم ولی کار نداد.
  • میثم سام در ۱۳۹۳/۱۲/۱۹ ۱۲:۲
    سلام من نه روی لوکال تونستم جواب بگیرم نه روی سرور
    خیلی برام مهم 
    اگه بتونید یه نمونه از پروژه برام بفرستید خیلی ممنون میشم
     
  • حمیدرضا م در ۱۳۹۴/۰۲/۰۵ ۱۸:۷
    برای من ارور 404 میده و اصلا BeginRequest اجرا نمیشه...
    (مثل حالتیه که WildCardDNS روی سرور تنظیم نشده باشه و درخواست‌ها به سایت اصلی بر نگرده)

    به نظر "وقتی برنامه رو با development server خود vs اجرا میکنم ساب دومین‌ها کار میکنه ... با iis express که تست میکنم هم خطای 400 bad request میده "

    دقیقا فکر کنم مشکل من هم همین باشه که با iiis express دارم برنامه رو اجرا می‌کنم.  میشه دوستان درباره development server خود vs توضیح بدن. 
  • مهدی مقدسی در ۱۳۹۴/۰۳/۲۱ ۱۵:۸
    من میخواستم این کارو در هاست انجام بدم. میشه مراحل و منابع برام معرفی کنید.
    • وحید نصیری در ۱۳۹۴/۰۳/۲۱ ۱۵:۳۳
      به کنترل پنل دومینی که ثبت کردید وارد شوید. در آنجا امکان ثبت subdomain هست. چیزی مثل مطلب «بلاگر و دومین سفارشی». ظاهر و اینترفیس این عملیات در هاست‌های مختلف، متفاوت است؛ ولی مفاهیم اصلی آن خیر.
  • صابر فتح الهی در ۱۳۹۴/۰۸/۱۲ ۰:۹
    با سلام
    من تنظیمات مورد نظر انجام دادم. اما زمانی که درخواستی مثل http://store1.localhost:61386 با خطای زیر مواجه میشم. در واقع اصلا کنترل به برنامه من نمیرسه.

    Bad Request - Invalid Hostname
    
    HTTP Error 400. The request hostname is invalid.
    • وحید نصیری در ۱۳۹۴/۰۸/۱۲ ۱:۶
      یک سری کتاب و مطلب در اشتراک‌ها مخصوص این مطلب جمع آوری شده‌اند.
      • صابر فتح الهی در ۱۳۹۴/۰۸/۱۲ ۱۱:۴
        متشکرم از پاسختون؛ من به این نتیجه رسیدم:
        علاوه بر تنظیماتی که دوستمون توی فایل hosts انجام دادن باید توی مسیر IIS Express فایل applicatinHost.config را باز کرده و در قسمت binding پروژه دلخواهمون کد‌های شبیه زیر را وارد کنیم.

        <bindings>
                  <binding protocol="http" bindingInformation="*:6100:localhost" />
                  <binding protocol="http" bindingInformation="*:6100:mysite.com" />
                  <binding protocol="http" bindingInformation="*:6100:store1.mysite.com" />
                  <binding protocol="http" bindingInformation="*:6100:store2.mysite.com" />
                  <binding protocol="http" bindingInformation="*:6100:store3.mysite.com" />
                  <binding protocol="http" bindingInformation="*:6100:store4.mysite.com" />
                  <binding protocol="http" bindingInformation="*:6100:store5.mysite.com" />
                  <binding protocol="http" bindingInformation="*:6100:master.mysite.com" />
                </bindings>
        • صابر فتح الهی در ۱۳۹۴/۰۸/۱۳ ۹:۱۹
          مراحل کلی کار به این شکل است:
          1- باز کردن فایل hosts و نوشتن کدهای زیر (البته شما می‌توانید هر اسم دلخواهی وارد نمایید)
           127.0.0.1 localhost
          127.0.0.1 mysite.com
          127.0.0.1 master.mysite.com
          127.0.0.1 store1.mysite.com
          127.0.0.1 store2.mysite.com
          127.0.0.1 store3.mysite.com
          127.0.0.1 store4.mysite.com
          127.0.0.1 store5.mysite.com
          127.0.0.1 store6.mysite.com
          127.0.0.1 store7.mysite.com
          127.0.0.1 store8.mysite.com
          127.0.0.1 store9.mysite.com
          2- اضافه کردن کد‌های زیر به قسمت binding در فایل applicationHosts.config از مسیر نصب IISExpress
           <bindings>
          <!--<binding protocol="http" bindingInformation="*:80:localhost" />-->
          <binding protocol="http" bindingInformation="*:80:mysite.com" />
          <binding protocol="http" bindingInformation="*:80:master.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store1.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store2.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store3.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store4.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store5.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store6.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store7.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store8.mysite.com" />
          <binding protocol="http" bindingInformation="*:80:store9.mysite.com" />
            </bindings>
          3- باید برای IIS این آدرس‌ها را رجیستر کرد در غیر این صورت در زمان اجرا با خطا مواجه می‌شویم
          برای این کار ابتدا cmd را با دسترسی مدیریتی اجرا کنید و با استفاده از دستور زیر می‌توان تک تک دامنه‌ها را رجیستر کرد:
           netsh http add urlacl url=http://mysite.com:80/ user=everyone
          netsh http add urlacl url=http://master.mysite.com:80/ user=everyone
          .
          .
          .
          netsh http add urlacl url=http://store9.mysite.com:80/ user=everyone
          در این صورت با اجرای پروژه سایت شما با آدرس‌های mysite.com و زیر دامنه‌های آن در دسترس خواهد بود.
          پ.ن: در صورتی که نمی‌خواهید از پورت 80 استفاده کنید میتوانید به جای 80 پورت دلخواه خود را وارد نمایید. در این صورت از طریق آدرس mysite.com:mportnumber در دسترس خواهد بود