Apache VirtualHost के भीतर रीडायरेक्ट URL?


61

मेरे पास अपाचे के साथ एक समर्पित सर्वर है, जिस पर मैंने कुछ VirtualHosts स्थापित किए हैं। मैंने www डोमेन के साथ-साथ गैर-www डोमेन को संभालने के लिए एक सेट किया है।

Www के लिए मेरा VH .conf फ़ाइल:

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

इसके साथ .htaccess:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

क्या गैर-www संस्करण में www को पुनर्निर्देशित करने का एक सरल तरीका है? वर्तमान में मैं दोनों संस्करणों को एक ही साथ भेज रहा हूं DocumentRootऔर उपयोग कर .htaccessरहा हूं, लेकिन मुझे यकीन है कि मुझे VirtualHost फ़ाइल में ऐसा करने में सक्षम होना चाहिए।


जवाबों:


105

पता चला है mod_rewriteनियमों से अलग VirtualHosts फ़ाइल में ठीक हैं, RewriteBaseनियम। मैंने इसे समाप्त किया:

<VirtualHost *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

संपादित करें: टिप्पणियों में जोशी की सलाह पर, अब मैं इस सरलीकृत संस्करण का उपयोग Redirectनिर्देश से कर रहा हूँ mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

2
इसके लिए आपको mod_rewrite की जरूरत नहीं है। इसके बजाय mod_alias और इसके पुनर्निर्देशन निर्देश का उपयोग करें।
जोशी

@ जोशी: उससे क्या फायदा होगा? क्या यह तेज है?
असंतुष्टगीत

12
आपको केवल ग्राहक को पुनर्निर्देशित करने के लिए उसके सभी चेक और संभावनाओं के साथ पूर्ण-विकसित फिर से लिखना इंजन की आवश्यकता नहीं है। यह (मामूली) तेजी से होगा क्योंकि mod_alias mod_rewrite के रूप में जटिल नहीं है और आपको mod_rewrite के साथ दो के बजाय केवल एक निर्देश (पुनर्निर्देशन) की आवश्यकता होगी। और अंतिम लेकिन कम से कम IMHO यह समझना आसान है कि कॉन्फ़िगरेशन में क्या होता है जब कोई इसे पहली बार देखता है।
जोशी

1
कुछ अजीब कारणों से Redirect 301 .. हमारे लिए काम नहीं किया। हमें RewriteRule विकल्प का उपयोग करना था।
so_mv

नोट: Windows Server 2008 R2 एंटरप्राइज़ पर WAMPSERVER 2.0 पर PHP 5.3.0 का उपयोग करने के :80बाद , "निषिद्ध" वापस करने के लिए सब कुछ शामिल नहीं होने के VirtualHost *कारण !
सेस टिम्मरमैन

4

301 रीडायरेक्ट के साथ बहुत सावधान रहें क्योंकि, डिफ़ॉल्ट रूप से, 301 रीडायरेक्ट प्राप्त करने वाला एक ब्राउज़र इसे स्थायी रूप से संग्रहीत करेगा - जिसका अर्थ है कि आप उस नियंत्रण को छोड़ देंगे जो उस डोमेन को देखने का प्रयास करते समय दिखाई देगा www.example.com

उदाहरण के लिए इस चर्चा को देखें http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

इसलिए या तो सुनिश्चित करें कि यह कैश नहीं हुआ है, या mod_proxy का उपयोग करें (मैं mod_proxy की सलाह देता हूं)।

यदि आप उपयोगकर्ता को ब्राउज़र पता बार पर URL परिवर्तन देखने देने के साथ ठीक हैं, तो mod_rewrite का उपयोग करें:

<VirtualHost *>
 ServerName www.example.com
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^www.example.com
 RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
 Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
 Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>

यदि आप चाहते हैं कि "रीडायरेक्ट" उपयोगकर्ता के लिए अदृश्य हो, तो mod_proxy का उपयोग करें:

<VirtualHost *>
 ServerName www.example.com
 ProxyRequests Off
 <Proxy *>
 Order Deny,Allow
 Deny from all
 Allow from 203.0.113.67
 </Proxy>
 ProxyPass / http://example.com/
 ProxyPassReverse / http://example.com/
</VirtualHost>

यह ध्यान दिया जाना चाहिए कि mod_proxy, जब बुरी तरह से कॉन्फ़िगर किया गया है, तो आपके नेटवर्क को नुकसान पहुंचा सकता है।


5
301 की बात यह है कि यह एक स्थायी पुनर्निर्देशन है; यदि आप एक गैर-स्थायी पुनर्निर्देशन चाहते हैं, तो आपको इसके बजाय 302 या 307 का उपयोग करना चाहिए।
10

2

आप जोड़ सकते हैं ServerAlias example.comकरने के लिए VirtualHost, लेकिन प्रदर्शन में एक रीडायरेक्ट से भिन्न होगी।

संपादित करें

चूंकि आप पुनर्निर्देशित करना चाहते हैं और आपको उन्नत कार्यक्षमता की आवश्यकता नहीं है, ऐसा लगता है कि उपयोग Redirectकरना आपके लिए पर्याप्त होना चाहिए। आप Redirectएक VirtualHost निर्देश के तहत रखा जाएगा ।

एक ग्राहक पक्ष समाधान एक meta refreshटैग का उपयोग करने के लिए होगा ।


क्या आप थोड़ा और समझा सकते हैं? मैं इस विधि का उपयोग www.example.comकरने के लिए कैसे पुनर्निर्देशित करूंगा example.com?
असंतुष्टगीत

आपकी प्राथमिक vhost में, आपके पास ServerNameऔर दोनों के लिए प्रविष्टियाँ हैं ServerAlias। एक के पास example.com और दूसरे www.example.com हैं। फिर, दोनों डीएनएस प्रविष्टियां एक ही vhost में निर्दिष्ट दस्तावेजों तक पहुंच प्राप्त करेंगी।
वार्नर

मैं एक पुनर्निर्देशन करना चाहता हूं , न कि केवल एक उपनाम।
असंतुष्टगीतगेट

तब जोशी की सिफारिश आपके लिए एक अच्छा तरीका हो सकती है। इस बिंदु पर बालों को अलग किया जा रहा है।
वार्नर

1

ठीक है, आप SERVERNAME www.example.com के लिए एक वर्चुअल होस्ट बना सकते हैं और इसे servername.com के साथ दूसरे वर्चुअल होस्ट पर रीडायरेक्ट कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.