سؤال

أعلم أنه كانت هناك بعض المواضيع حول هذا من قبل، لكنني جربت كل ما تم اقتراحه (يمكنني العثور عليه) ولم ينجح أي شيء بالنسبة لي حتى الآن ...

مع أخذ ذلك في الاعتبار، إليك ما أحاول القيام به:

أولاً، أريد السماح للمستخدمين بنشر الصفحات ومنحهم نطاقًا فرعيًا من اختيارهم (على سبيل المثال:user.mysite.com).من ما يمكنني جمعه، فإن أفضل طريقة للقيام بذلك هي تعيين user.mysite.com إلى mysite.com/user باستخدام mod_rewrite و.htaccess - هل هذا صحيح؟

إذا كان ذلك صحيحًا، فهل يمكن لأي شخص أن يعطيني تعليمات واضحة حول كيفية القيام بذلك؟

أيضًا، أقوم بكل عمليات التطوير الخاصة بي محليًا، باستخدام MAMP، لذا إذا استطاع شخص ما أن يخبرني بكيفية إعداد بيئتي المحلية للعمل بنفس الطريقة (لقد قرأت أن هذا أكثر صعوبة)، سأكون ممتنًا له كثيرًا.بصراحة، لقد حاولت كل شيء دون جدوى، وبما أن هذه هي المرة الأولى التي أقوم فيها بشيء كهذا، فأنا ضائع تمامًا.شكرا جزيلا على اي مساعدة!

تحديث: كانت بعض هذه الإجابات مفيدة حقًا، ولكن بالنسبة للنظام الذي أفكر فيه، فإن إضافة نطاق فرعي يدويًا لكل مستخدم ليس خيارًا.ما أطلبه حقًا هو كيفية القيام بذلك بسرعة، وإعادة توجيه Wildcard.mysite.com إلى mysite.com/wildcard -- الطريقة التي تم بها إعداد Tumblr هي مثال مثالي لما أود القيام به.شكرًا لك مرة أخرى!

هل كانت مفيدة؟

المحلول

بقدر ما يتعلق الأمر بكيفية إعداد حرف البدل للنطاق الفرعي لنظام أسماء النطاقات (DNS)، فستكون هذه إحدى وظائف موفر استضافة DNS الخاص بك.قد تكون هذه خطوات مختلفة اعتمادًا على مزود الاستضافة لديك وسيكون سؤالًا أفضل بالنسبة لهم.

بمجرد إعداد ذلك مع مضيف DNS، من تطبيق الويب الخاص بك، فإنك في الواقع مجرد إعادة كتابة عنوان URL، وهو ما يمكن إجراؤه باستخدام نوع من الوحدات النمطية لخادم الويب نفسه، مثل إعادة كتابة isapi إذا كنت تستخدم IIS (هذا سيكون الطريق المفضل إن أمكن).يمكنك أيضًا التعامل مع إعادة الكتابة على مستوى التطبيق أيضًا (مثل استخدام التوجيه إذا كان على ASP.NET).

ستعيد كتابة عنوان URL بهذه الطريقة http://myname.domain.com قد يصبح http://domain.com/something.aspx?name=myname أو شيء ما.من الآن فصاعدًا، يمكنك التعامل معها كما لو كانت قيمة myname موجودة في سلسلة الاستعلام كالمعتاد.هل هذا منطقي؟آمل أنني لم أسيء فهم ما كنت بعد.

يحرر:

أنا لا أقترح عليك إنشاء نطاق فرعي لكل مستخدم، ولكن بدلاً من ذلك قم بإنشاء نطاق فرعي بدل للنطاق نفسه، لذلك أي شئينتقل .domain.com (بشكل أساسي *.domain.com) إلى موقعك.لدي العديد من المجالات مع الإعداد com.mydomain.تعليماتهم لإعداد هذا هي كما يلي:

نعم ، يمكنك تكوين بطاقة برية ولكنها ستعمل فقط إذا قمت بإعدادها كسجل.لا تعمل البطاقات البرية مع اسم ج.لاستخدام بطاقة Wildcard ، يمكنك استخدام حرف Astericks '*'.على سبيل المثال ، إذا قمت بإنشاء وسجل باستخدام بطاقة برية ، .domain.com ، أي شيء يتم إدخاله في المكان الذي 'يقع ، وسوف حل إلى عنوان IP المحدد.لذا ، إذا قمت بإدخال "www" أو "FTP" أو "الموقع" أو أي شيء آخر قبل اسم المجال ، فسيتم حله دائمًا إلى عنوان IP

لقد تم إعداد بعض هذه النطاقات بهذه الطريقة، حيث انتقل *.domain.com إلى موقعي.يمكنني بعد ذلك قراءة عنوان URL الأساسي في تطبيق الويب الخاص بي لأرى أن ryan.domain.com هو ما تم الوصول إليه حاليًا، أو أن bill.domain.com هو ما تم استخدامه.يمكنني بعد ذلك إما:

  1. استخدم إعادة كتابة عنوان URL بحيث يصبح النطاق الفرعي جزءًا من سلسلة الاستعلام OR
  2. ما عليك سوى قراءة قيمة المضيف من عنوان URL الذي تم الوصول إليه وتنفيذ بعض المنطق بناءً على تلك القيمة.

هل هذا منطقي؟لقد قمت بإعداد العديد من المواقع بهذه الطريقة بالضبط:قم بإنشاء حرف البدل للمجال باستخدام مضيف DNS ثم قم ببساطة بقراءة المضيف أو المجال الأساسي من عنوان URL لتحديد ما سيتم عرضه بناءً على النطاق الفرعي (الذي كان في الواقع اسم مستخدم)

تحرير 2:

لا توجد طريقة للقيام بذلك دون إدخال DNS.يحتاج "عالم الإنترنت" إلى معرفة أن name1.domain.com وname2.domain.com و... وnameN.domain.com كلها تنتقل إلى عنوان IP الخاص بخادمك.الطريقة الوحيدة للقيام بذلك هي باستخدام إدخال DNS المناسب.يجب عليك إضافة إدخال DNS الخاص بحرف البدل للمجال الخاص بك مع مضيف DNS الخاص بك.بعد ذلك، كل ما عليك فعله هو قراءة النطاق الفرعي من عنوان URL واتخاذ الإجراء المناسب في التعليمات البرمجية الخاصة بك.

نصائح أخرى

أفضل ما يمكنك فعله إذا كنت تقوم بتشغيل *AMP هو تنفيذ ما يقترحه توماس والقيام باستضافة افتراضية في Apache.يمكنك القيام بذلك إما مع أو بدون إعادة التوجيه التي تصفها.

المضيفين الظاهري

على الأرجح سوف ترغب في القيام به المضيفين الظاهريين المعتمدين على الأسماء, ، نظرًا لأنه من الأسهل إعداده ولا يتطلب سوى عنوان IP واحد (وبالتالي سيكون من السهل أيضًا إعداده واختباره على جهاز MAMP المحلي الخاص بك).تعد المضيفات الافتراضية المستندة إلى IP أفضل في بعض النواحي الأخرى، ولكن يجب أن يكون لديك عنوان IP لكل مجال.

هذا صفحة ويكيبيديا يناقش الاختلافات والروابط إلى جولة أساسية جيدة حول كيفية عمل استضافة vhosts المستندة إلى الأسماء في الأسفل.

على جهازك المحلي للاختبار، سيتعين عليك أيضًا إعداد أسماء DNS وهمية في /etc/hosts لأسماء نطاقات الاختبار المزيفة الخاصة بك.أي.إذا كان لديك Apache يستمع على المضيف المحلي وقمت بإعداد vhost1.test.domain وvhost2.test.domain في تكوينات Apache، فما عليك سوى إضافة هذه النطاقات إلى السطر 127.0.0.1 في /etc/hosts، بعد المضيف المحلي:

127.0.0.1 localhost vhost1.test.domain vhost2.test.domain

بمجرد الانتهاء من تحرير /etc/hosts وإضافة تكوينات المضيف الظاهري المستندة إلى الاسم إلى ملف (ملفات) تكوين Apache، انتهي الأمر، أعد تشغيل Apache ومن المفترض أن تعمل مجالات الاختبار الخاصة بك.

إعادة التوجيه باستخدام mod_rewrite

إذا كنت تريد إجراء عمليات إعادة توجيه باستخدام mod_rewrite (بحيث لا تتم استضافة user.example.com مباشرة وبدلاً من ذلك يتم إعادة التوجيه إلى example.com/user)، فستحتاج أيضًا إلى إجراء RewriteCond لمطابقة النطاق الفرعي وإعادة توجيهه:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com
RewriteRule ^(.*)$ http://example.com/subdomain$1 [R]

يمكنك وضع هذا في ملف .htaccess أو في تكوين Apache الرئيسي لديك.

ستحتاج إلى إضافة زوج من القواعد مثل القاعدة الأخيرة لكل نطاق فرعي تريد إعادة توجيهه.أو ، قد تكون قادرًا على التقاط النطاق الفرعي في إعادة كتابة لتتمكن من استخدام قاعدة أحرف برية واحدة لإعادة توجيه * example.com إلى example.com/ * - لكن رائحته سيئة للغاية بالنسبة لي من وجهة نظر أمان.

كل ذلك معًا، vhosts وإعادة التوجيه

من الأفضل أن تكون أكثر وضوحًا وأن تقوم بإعداد قسم تكوين المضيف الظاهري لكل اسم مضيف تريد الاستماع إليه، ووضع قواعد إعادة الكتابة لكل من أسماء المضيفين هذه داخل تكوين المضيف الظاهري الخاص به.(من الأفضل دائمًا وضع هذا النوع من الأشياء داخل تكوين Apache الخاص بك وليس .htaccess، إذا كان بإمكانك مساعدته - فإن .htaccess يبطئ الأداء لأن Apache يبحث باستمرار في نظام الملفات عن ملفات .htaccess ويعيد تحليلها، و إنها أقل أمانًا لأنه يمكن للمستخدمين إفسادها.)

معًا بهذه الطريقة، سيكون تكوين vhost داخل تكوينات Apache لديك هو:

NameVirtualHost 127.0.0.1:80

# Your "default" configuration must go first
<VirtualHost 127.0.0.1:80>
  ServerName example.com
  ServerAlias www.example.com
  DocumentRoot /www/siteroot
  # etc.
</VirtualHost>

# First subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost1.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost1$1 [R]
</VirtualHost>

# Second subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost2.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
</VirtualHost>

أدرك أنني تأخرت كثيرًا في الرد على هذا السؤال، ولكن واجهت نفس المشكلة فيما يتعلق بحل التنمية المحلية.في موضوع SO آخر لقد وجدت حلولاً أفضل واعتقدت أنني سأشاركها مع أي شخص لديه نفس السؤال في المستقبل:

يمتلك VMware مجال Wild Card الذي يحل أي نطاق فرعي إلى 127.0.0.1:

vcap.me resolves to 127.0.0.1
www.vcap.me resolves to 127.0.0.1

أو لمزيد من التنوع، تمتلك 37 Signals نطاقًا لتعيين أي نطاق فرعي لأي عنوان IP محدد باستخدام تنسيق محدد:

127.0.0.1.xip.io resolves to 127.0.0.1
www.127.0.0.1.xip.io resolves to 127.0.0.1
db.192.168.0.1.xip.io resolves to 192.168.0.1

يرى xip.io لمزيد من المعلومات

أنا أستخدم Ubuntu 16.04 ومنذ 14.04 أستخدم الحل المقدم من Dave Evans هنا وأنه يعمل بشكل جيد بالنسبة لي.

  1. ثَبَّتَ dnsmasq

    sudo apt-get install dnsmasq
    
  2. إنشاء ملف جديد localhost.conf تحت /etc/dnsmasq.d دير مع السطر التالي

    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
    
  3. يحرر /etc/dhcp/dhclient.conf وأضف السطر التالي

    prepend domain-name-servers 127.0.0.1;
    

    (ربما ستجد أن هذا السطر موجود بالفعل وتحتاج فقط إلى إلغاء التعليق عليه.)

  4. آخر واحد هو إعادة تشغيل الخدمة

    sudo systemctl restart dnsmasq
    sudo dhclient
    

وأخيرا، يجب عليك التحقق مما إذا كان يعمل.

dig whatever.localhost

ملحوظة:

إذا كنت تريد استخدامه على خادم الويب الخاص بك، فأنت بحاجة ببساطة إلى تغيير 127.0.0.0 إلى عنوان IP الفعلي الخاص بك.

كان علي أن أفعل نفس الشيء تمامًا مع أحد مواقعي.يمكنك اتباع الخطوات التالية

  1. إذا كان لديك cPanel على الخادم الخاص بك، فقم بإنشاء نطاق فرعي *, إذا لم يكن الأمر كذلك، فسيتعين عليك إعداد سجل A في DNS الخاص بك (للاطلاع على BIND، انظر http://ma.tt/2003/10/wildcard-dns-and-sub-domains/).على المطور الخاص بك.سيكون من الأفضل لك تزييف النطاقات الفرعية عن طريق إضافة كل منها إلى نطاقك hosts ملف.

  2. (إذا كنت تستخدم cPanel فلن تضطر إلى القيام بذلك).سيتعين عليك إضافة شيء مثل ما يلي إلى ملف Apache vhosts الخاص بك.يعتمد الأمر إلى حد كبير على نوع الخادم (سواء كان مشتركًا أم لا) الذي تقوم بتشغيله.الكود التالي غير مكتمل.إنه فقط لإعطاء التوجيه.ملحوظة: ServerAlias example.com *.example.com أنه مهم.

    <VirtualHost 127.0.0.1:80>  
            DocumentRoot /var/www/  
            ServerName example.com  
            ServerAlias example.com *.example.com  
    </VirtualHost>
    
  3. بعد ذلك، يمكنك استخدام برنامج PHP للتحقق من رأس "المضيف" ومعرفة النطاق الفرعي وتقديم المحتوى وفقًا لذلك.

أولاً ، أريد أن أسمح للمستخدمين بنشر الصفحات ومنحهم كل مجال فرعي من اختيارهم (على سبيل المثال:user.mysite.com).من ما يمكنني جمعه ، فإن أفضل طريقة للقيام بذلك هي تعيين user.mysite.com إلى mysite.com/user مع mod_rewrite و .htaccess - هل هذا صحيح؟

قد يكون من الأفضل لك استخدام المضيفين الظاهري.بهذه الطريقة، يمكن لكل مستخدم أن يكون لديه تكوين خادم ويب مستقل إلى حد كبير عن الآخرين.

بناء الجملة يذهب شيء من هذا القبيل:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>

مما رأيته على العديد من مضيفي الويب، أنهم يقومون بإعداد مضيف افتراضي على Apache.

لذا، إذا تم تقديم www.mysite.com الخاص بك من /var/www، فيمكنك إنشاء مجلد لكل مستخدم.ثم قم بتعيين المضيف الظاهري لهذا المجلد.

وبهذا، يعمل كل من mysite.com/user وuser.mysite.com.

أما بالنسبة لبيئة الاختبار الخاصة بك، إذا كنت تستخدم نظام التشغيل Windows، فإنني أقترح تحرير ملف HOSTS الخاص بك لتعيين mysite.com على جهاز الكمبيوتر المحلي الخاص بك (127.0.0.1)، بالإضافة إلى أي نطاقات فرعية قمت بإعدادها للاختبار.

الحل الذي وجدته لـ Ubuntu 18.04 مشابه لـ هذا ولكن يتضمن تكوين NetworkManager:

  1. تحرير الملف /etc/NetworkManager/NetworkManager.conf, ، وأضف السطر dns=dnsmasq إلى [main] قسم

    sudo editor /etc/NetworkManager/NetworkManager.conf
    

    يجب أن يبدو مثل هذا:

    [main]
    plugins=ifupdown,keyfile
    dns=dnsmasq
    ...
    
  2. ابدأ باستخدام resolv.conf الخاص بـ NetworkManager

    sudo rm /etc/resolv.conf
    sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
    
  3. قم بإنشاء ملف بتكوين أحرف البدل الخاصة بك

    echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
    
  4. أعد تحميل تكوين NetworkManager

    sudo systemctl reload NetworkManager
    
  5. قم بتجريبه

    dig localdomain.localhost
    

يمكنك أيضًا إضافة أي مجال آخر، وهو أمر مفيد جدًا لبعض أنواع المصادقة عند استخدام إعداد التطوير المحلي.

echo 'address=/.local-dev.workdomain.com/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/workdomain-wildcard.conf

ثم يعمل هذا:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top