উপযুক্ত ডকুমেন্টের রুট উপস্থিত থাকলে কেবল ভার্চুয়াল ডকুমেন্টরুট * ব্যবহার করুন


8

আমি এমন একটি পরিবেশ স্থাপন করতে চাই যেখানে কনফিগারেশনটি লোড না করেই অ্যাপাচি ভার্চুয়াল হোস্টগুলি গতিশীলভাবে তৈরি করা যায়।

আমি মোড_ভোস্ট_লিয়াস দিয়ে এটি করতে পারি , আমি আমার ডিফল্ট ভার্চুয়াল হোস্টটি এর মতো কিছু সেট আপ করেছি

<VirtualHost *>
  UseCanonicalName Off
  VirtualDocumentRoot /var/www/sandboxes/domains/%0
  ServerName catchall.host
</VirtualHost>

এটি ঠিক কাজ করে, তবে বর্তমানে সেট আপ করা হোস্টনামের জন্য যদি একটি অনুরোধ করা হয় তবে আমি একটি 404 পাওয়া যায়নি ত্রুটি পেয়েছি।

আমি কি চাই সত্যিই শুধুমাত্র এই VirtualHost পদাঘাত আছে করতে হবে মত শুধুমাত্র যদি ডকুমেন্ট রুট বিদ্যমান অন্যথায় এটি (, অন্য vhost দেখুন মেলে অন্য কথায় উপস্থিতিতে করতে চেষ্টা আছে VirtualDocumentRoot একটি ব্যবহার একই ভাবে কাজ ServerAlias)

প্রথম ভোস্টটি কেবল সমস্ত অনুরোধগুলি পরিচালনা করে আমি এটি দ্বিতীয় ভোস্ট তৈরির চেষ্টা করেছি, তবে এটি কার্যকর হয়নি - এমন ডোমেনগুলির জন্য অনুরোধগুলি যেখানে ভার্চুয়াল ডকুমেন্টরুটটি কনফিগার করা হয়েছিল সেটি ডিফল্ট ভোস্টের মধ্যে পড়ছিল।

সুতরাং, আমি কীভাবে গতিশীলভাবে vhosts কনফিগার করতে পারি, তবে যেগুলি এখনও কনফিগার করা হয়নি তার জন্য অন্য একটি ভোস্টের ফ্যালব্যাক সহ?

উত্তর:


7

আমি এমন একটি সন্ধান পেয়েছি যা আমার পক্ষে কাজ করে।

আমি পিএইচপি স্ক্রিপ্টে 404 ত্রুটি বাছাই করতে একটি ত্রুটি ডকুমেন্ট ব্যবহার করতে পারি । প্রথমদিকে, এটি সমস্যাযুক্ত বলে মনে হয়েছিল। ডকুমেন্টরুট না থাকলে স্ক্রিপ্টটি কোথায় থাকবে?

আমি একটি ভিন্ন ডোমেন থেকে পরিবেশন করা ত্রুটি বার্তার জন্য একটি ইউআরএল ব্যবহার করতে পারি। তবে পরীক্ষায় আমি মূলত অনুরোধ করা ডোমেনটি কী তা জানার কোনও উপায় খুঁজে পেলাম না।

উত্তর ছিল ওরফে একটি ডিরেক্টরি ও যে আউট ত্রুটি পরিবেশন করা, তাই এই আমার vhost দেখুন কেমন লাগে

<VirtualHost *>
  UseCanonicalName Off
  VirtualDocumentRoot /var/www/sandboxes/domains/%0
  ServerName catchall.host
  Alias /errors /var/www/default/errors/
  ErrorDocument 404 /errors/notfound.php
</VirtualHost>

এখন, যখন একটি অসমর্থিত ডোমেনটির জন্য অনুরোধ করা হয়েছে, তার পরিবর্তে /var/www/default/erferences/notfound.php এ স্ক্রিপ্টটি চালু করা হবে। এই স্ক্রিপ্টটি কী ডোমেনটির জন্য অনুরোধ করা হয়েছে তা দেখতে $ _SERVER ['HTTP_HOST'] পরীক্ষা করতে পারে। যদি এটি আসলে কনফিগার করা থাকে তবে আমাদের নিয়মিত 404 থাকে it's এটি কনফিগার না করা থাকলে আমরা কিছু বিকল্প ত্রুটি বার্তা প্রদর্শন করতে পারি। আমার ক্ষেত্রে, আমি যেখানে ইউটি দেখাব সেখানে ভোস্ট সেট আপ করতে সহায়তা করবে।


এটি কি ডিফল্টর প্রতি অনুরোধের স্থিতি হিসাবে 404 ফেলে দেবে না?
কাইল

1
ভার্চুয়াল ডকুমেন্টরুটটি উপস্থিত না থাকলে ত্রুটি হ্যান্ডলারটি কেবলমাত্র অনুরোধ করা হয় (অথবা এটি সত্যই একটি 404 ছিল, তবে notfound.php সহজেই পার্থক্যটি বলতে পারে)।
পল ডিকসন

3

গুগলিংয়ের সময় আমি আপনার প্রশ্নটি পেয়েছি। আমি ঠিক একই সমস্যা ছিল এবং বর্ণনা অনুযায়ী ফিক্স প্রয়োগ পল'স উত্তর । তবে, আমার জটিল ওয়েব অ্যাপ্লিকেশনটির জন্য, আমি সমস্ত অনুরোধের ট্রাটকে এককভাবে রাউটিংয়ে খুশি নই notfound.php

শেষ পর্যন্ত, আমি কেবল আমার ভার্চুয়ালহস্ট কনফিগারেশন সম্পাদনা করে বাহ্যিক স্ক্রিপ্টগুলি ছাড়াই সমস্যাটি সমাধান করতে সক্ষম হয়েছি।

প্রথমে, আমার ভার্চুয়ালহোস্টটি এভাবে কনফিগার করা হয়েছিল:

<VirtualHost *:80>
    Usecanonicalname Off
    Virtualdocumentroot /mnt/ramdisk/www/cms-%-3.0-development/
</VirtualHost>

আমি URL গুলি হত client1.domainname.com, client2.domainname.comএবংwhatever.domainname.com

যা সমাধান হয়েছে /mnt/ramdisk/www/cms-client1-development/, /mnt/ramdisk/www/cms-client2-development/এবং/mnt/ramdisk/www/cms-whatever-development/

তবে, একটি ইউআরএল nonexistent.domainname.comআমাকে 404 দেবে কারণ ডিরেক্টরিটি /mnt/ramdisk/www/cms-nonexistent-development/বিদ্যমান ছিল না exist আমি এই সাবডোমেনগুলি ডিরেক্টরিটি ব্যবহার করতে চেয়েছিলাম/mnt/ramdisk/www/cms-default-development/

আমি এটি ব্যবহার করে ModRewriteএবং এটি স্থির করেছি ModProxy:

<VirtualHost *:80>
    Usecanonicalname Off
    Virtualdocumentroot /mnt/ramdisk/www/cms-%-3.0-development/
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(.*)\.domainname\.com$ [NC]
    RewriteCond /mnt/ramdisk/www/cms-%1-development/ !-d
    RewriteRule (.*) http://default.domainname.com/$1 [P,L]
</VirtualHost>

কি এই আছে হল: দখল সাবডোমেন (এর আগের অংশ .domainname.com), সন্নিবেশ সেই পথ (% 1) এবং ডিফল্ট URL এ প্রক্সি অনুরোধ মধ্যে শুধুমাত্র যদি ডিরেক্টরির অস্তিত্ব নেই।

একটি প্রক্সি ব্যবহার করে, প্রক্রিয়াটি স্বচ্ছ এবং ব্যবহারকারী মনে করেন যে তিনি http://nonexistance.domainname.com পরিদর্শন করেছেন , যখন তিনি আসলে http://default.domainname.com থেকে সামগ্রীটি দেখছেন ।


3

আমি অ্যাপাচি 2 ডায়নামিক ভোস্ট ফ্যালব্যাকের জন্য এই প্রশ্নটিও গুগল করতে পেরেছিলাম এবং লুসের উত্তর আমার সমস্যা সমাধানে আমাকে অনেক সহায়তা করেছে, তবে আমি এখনও আমার লক্ষ্য অর্জনে কী করেছি তা দেখাতে চাই মূলত কারণ এটি কিছু অতিরিক্ত কাজ জড়িত এবং কারণ আমি এটি মনে করি ভবিষ্যতের যে কোনও গুগলারের জন্য সহায়ক হতে পারে ...

আমার লক্ষ্য

  • আমার ভিপিএসের দিকে নির্দেশ করে সমস্ত ডোমেন এবং সাবডোমেনগুলির জন্য ডায়নামিক ভোস্টিং
  • foo.com হিসাবে একই বিষয়বস্তু পরিবেশন করা উচিত www.foo.com
  • কোনও ধরণের ডিফল্ট অজানা ডোমেনগুলির জন্য ফলব্যাক
  • অজানা সাবডোমেন জন্য ফলব্যাক foo.comকরতে www.foo.comযদি না wwwপাওয়া যায় না, ফলব্যাক পরিবর্তে ডিফল্ট

ডিএনএস

আমার কয়েকটি ডোমেন (এবং তাদের সমস্ত সাবডোমেন) আমার ভিপিএসের দিকে নির্দেশ করছে, উদাহরণস্বরূপ:

  • foo.com
  • bar.com
  • foobar.com

নথি ব্যবস্থা

আমার কাছে নিম্নলিখিত ডিরেক্টরি রয়েছে, ডোমেনগুলিতে উপলব্ধ সাবডোমেনগুলির নামের সাথে ডিরেক্টরি রয়েছে, www ডিরেক্টরিটি প্রয়োজন, তবে কনফিগারেশনটি যেখানে উপস্থিত নেই সেখানে পরিস্থিতি মোকাবেলা করতে সক্ষম হওয়া উচিত। লোকালহোস্ট ডিফল্ট ফ্যালব্যাক হিসাবে ব্যবহৃত হয়:

/var
  /www
    /localhost
    /foo.com
       /www
       /bar
    /bar.com
       /foo

টেস্ট

আমার লক্ষ্যগুলি পরীক্ষারযোগ্য ক্ষেত্রে অনুবাদ করা:

  • foo.com foo.com/www থেকে পরিবেশন করা উচিত
  • www.foo.com থেকে পরিবেশিত হবে foo.com/www
  • bar.foo.com থেকে পরিবেশিত হবে foo.com/bar
  • foo.foo.com থেকে পরিবেশিত হবে foo.com/www (foo.com/foo অস্তিত্ব নেই)
  • বার ডট কম লোকালহোস্ট থেকে পরিবেশন করা উচিত (বার.com/www উপস্থিত নেই)
  • www.bar.com লোকালহোস্ট থেকে পরিবেশন করা উচিত (বার.com/www উপস্থিত নেই)
  • foo.bar.com বার.com/ foo থেকে পরিবেশন করা উচিত
  • বার.বার.কমকে লোকালহোস্ট থেকে পরিবেশন করা উচিত (বার / বারের অস্তিত্ব নেই)
  • foobar.com লোকালহোস্ট থেকে পরিবেশন করা উচিত (foobar.com বিদ্যমান নেই)
  • www.foobar.com লোকালহোস্ট থেকে পরিবেশন করা উচিত (foobar.com বিদ্যমান নেই)
  • foo.foobar.com লোকালহোস্ট থেকে পরিবেশন করা উচিত (foobar.com বিদ্যমান নেই)

সমাধান

এই ব্যবহার করে: mod_rewrite, mod_proxy_httpএবং অবশ্যই শুনব mod_vhost_alias

ServerName my.domain
ServerAdmin admin@my.domain

<VirtualHost *:80>
    ServerName localhost
    VirtualDocumentRoot /var/www/localhost
</VirtualHost>

<VirtualHost *:80>
    ServerName sub.domain
    ServerAlias *.*.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3

    RewriteEngine on

    RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
    RewriteCond /var/www/%2.%3 !-d
    RewriteRule (.*) http://localhost/$1 [P]

    RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
    RewriteCond /var/www/%2.%3/%1 !-d
    RewriteCond /var/www/%2.%3/www !-d
    RewriteRule (.*) http://localhost/$1 [P]

    RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
    RewriteCond /var/www/%2.%3/%1 !-d
    RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>

<VirtualHost *:80>
    ServerName bare.domain
    ServerAlias *.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/www

    RewriteEngine on

    RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
    RewriteCond /var/www/%1.%2 !-d [OR]
    RewriteCond /var/www/%1.%2/www !-d
    RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>

কিভাবে কাজ করে? তিনটি ভার্চুয়াল হোস্ট সংজ্ঞায়িত করা হয়েছে:

স্থানীয় হোস্ট

লোকালহোস্ট একটি ডিফল্ট হিসাবে পরিবেশন করে। সমাধানযোগ্য নয় এমন সমস্ত অনুরোধ লোকালহোস্ট দ্বারা পরিবেশন করা হয়। লোকালহোস্ট থেকে আপনার যে কোনও ডোমেইনে একটি সিমিলিংক সেটআপ করা সেই সাইটটিকে ডিফল্ট হিসাবে সেটআপ করার মতো।

sub.domain

সাব.ডোমেন ভোস্ট সমস্ত অনুরোধগুলি আকারে নিচ্ছে *.*.*। ডিফল্টরূপে সমস্ত অনুরোধগুলি /domain.com/subদ্বারা সংজ্ঞায়িত হিসাবে পরিবেশন করা হয় VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3

পিছু হট:

প্রথমটি RewriteRuleঅজানা ডোমেনগুলির যত্ন নেয়, যেমন। domain.comলোকালহোস্ট ওয়েবসাইটটি প্রক্সিং করে ডিরেক্টরিটি বিদ্যমান নেই।

দ্বিতীয়টি ডিরেক্টরি এবং ডিরেক্টরি RewriteRuleউভয় উপস্থিত না থাকলে লোকালহোস্টের সাথেও প্রক্স হয় ।domain.com/subdomain.com/www

তৃতীয় RewriteRuleপ্রক্সি domain.comকখন domain.com/subবিদ্যমান নেই। আমরা জানি domain.com/wwwদ্বিতীয় পুনর্লিখনের ব্লকের কারণে অস্তিত্ব আছে।

bare.domain

খালি.ডোমেন ভোস্ট *.*অনুরোধগুলি গ্রহণ করছে এবং সেগুলি সরবরাহ করে/domain.com/www

এখানে RewriteRuleইচ্ছার প্রক্সি স্থানীয় হোস্টের যখন domain.comবা domain.com/wwwকোন অস্তিত্ব নেই।

^ $%। * !!!

এই সমস্ত চিহ্নগুলিতে $এবং %লক্ষণগুলির চারপাশে আমার মাথা জড়িয়ে কিছুটা সমস্যা ছিল RewriteCondএবং RewriteRuleতাই আমি তাদের সম্পর্কে এখানে ব্যাখ্যা করব:

    ServerAlias *.*.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
    RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
    RewriteCond /var/www/%2.%3/%1 !-d
    RewriteRule (.*) http://%2.%3/$1 [P]
  • এর *মধ্যে ServerAliasরয়েছে কেবল ওয়াইল্ডকার্ড।
  • %nমধ্যে VirtualDocumentRootথেকে এসেছ দস্তাবেজের নাম ক্ষেপক
  • %nদ্বিতীয় RewriteCondপছন্দসই মান নির্বাচন করে পড়ুন (.*)প্রথম থেকে RewriteCondযেমন। অনুরোধ করা ডোমেনের অংশগুলি।
  • %nমধ্যে RewriteRuleখুব না।
  • $1মধ্যে RewriteRuleনির্বাচন বোঝায় (.*)শুরুতে RewriteRule। যা ?অনুরোধ url এ ডোমেন থেকে সমস্ত কিছু ক্যাপচার করে । কোনও ক্যোরিস্ট্রিং ইউআরএল দ্বারা স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায় mod_proxy

1

এটি কেবল সেখানে ফেলে দিই, আমি রেমিএনএল হিসাবে একই ফলাফল (মাইনাস লোকালহোস্ট পুনর্নির্দেশ) পাই, তবে সরাসরি সংযোগ করার সময় আইপি ঠিকানা সহ:

<VirtualHost _default_:80>
    RewriteEngine On
    RewriteCond %{HTTPS} Off [OR] 
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]
</VirtualHost>

<VirtualHost _default_:443>
    ServerName a.b.c.d
    ServerAlias *.*.*.*
    VirtualDocumentRoot /var/www/%0
</VirtualHost>

<VirtualHost _default_:443>
    ServerName a.b.c
    ServerAlias *.*.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
</VirtualHost>

<VirtualHost _default_:443>
    ServerName a.b
    ServerAlias *.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
</VirtualHost>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.