.htaccess www- उपसर्ग पृष्ठ पर ठीक से अनुप्रेषित नहीं करता है


9

मैं www के बिना एक url को पुनर्निर्देशित करने की कोशिश कर रहा हूं। www.version (example.com से www.example.com) पर। मैं सामान्य का उपयोग करता हूं

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

यह मेरी अन्य सभी परियोजनाओं पर काम करता है। हालांकि इस विशेष साइट पर, यह एक अनुप्रेषित लूप के साथ समाप्त होता है। यहाँ अजीब हिस्सा है: मैंने गैर-www संस्करण को कर्ल करने की कोशिश की, यह देखने के लिए कि हेडर क्या उपयोग करता है curl --get http://example.com --dump-header domain.header > domain.html। हेडर फ़ाइल इस तरह दिखती है:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

हालाँकि, परिणामी HTML फ़ाइल यह थी:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(फाइलों के बीच पते के अंतर पर ध्यान दें) क्या किसी को पता है कि इसे कैसे ठीक किया जाए (और नरक क्या कारण है)? कोई अन्य url पुनर्लेखन निर्देश ठीक काम करता है।

संपादित करें: इसमें फिर से लिखना लॉग समाहित है: (साइट को बहुत सारे लोगों द्वारा एक्सेस किया जाता है इसलिए रीराइट लॉग काफी लंबा हो गया, मुझे 100% यकीन नहीं है कि यह सही हिस्सा है)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

प्रवेश लॉग लाइन (शायद सही एक):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

Virtualhost की परिभाषा:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

EDIT2: ठीक है, मुझे अभी पता चला है कि अगर मैं ऐसा करता हूं (इस्तीफा दे दिया है और इसे बिना रीडायरेक्ट करने का प्रयास किया है।

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

यह कारण बनता है ठीक उसी रीडायरेक्ट लूप। गंभीरता से, क्या नरक है? क्या किसी को अंदाजा है कि संभवतः इसका क्या कारण हो सकता है?


क्या आप अपाचे को खुद संकलित करते हैं, या? लोकेशन हेडर के लिए यह असंभव है कि वे इस मामले में एक ही चर से लिए गए पेज से अलग हों, इसलिए यह बहुत ही अजीब है। मुझे लगता है कि अनुरोधों को सीधे अपाचे के पास भेज दिया जाता है, ठीक है, कोई अन्य सर्वर इनबिल्ट नहीं है?
टिम स्टोन

मैंने अपने आप को अपाचे और बीच में कोई अन्य सर्वर संकलित नहीं किया।

शायद आपका NS सर्वर ठीक से कॉन्फ़िगर नहीं हुआ है
venimus

4
ServerAlias ​​प्रविष्टि में सर्वर का नाम दोहराना आवश्यक नहीं है।
क्रिस

क्या आप फ़ाइल की सभी सामग्री यहां डाल सकते हैं
पूर्ववत

जवाबों:


2

मुझे जितना अजीब लगता है, Location: http://domain.cz/CURL द्वारा बताई गई हेडर लाइन है। आप कभी भी उस डोमेन पर रीडायरेक्ट नहीं होते हैं। रीडायरेक्ट लॉग में भी इसका कोई उल्लेख नहीं है।

किसी तरह से Locationहेडर्रूइट अपना सामान रखने के बाद हेडर को बदल दिया जाता है, और चूंकि आपने PHP के साथ हेडर को बदलने की कोशिश की थी, Locationइसलिए अनुरोध के संसाधित होने के बाद हेडर को स्पष्ट रूप से बदल दिया जाता है। केवल एक ही स्पष्टीकरण मैं सोच सकता हूं कि आप कहीं भी mod_header के साथ स्थान हेडर को संशोधित कर रहे हैं।

क्या आप सभी कॉन्फ़िगरेशन फ़ाइलों (httpd.conf, शामिल .conf फ़ाइलें और .htaccess फ़ाइल) की जाँच करते हैं, अगर आपको कहीं एक पंक्ति इसी तरह मिलती है:

Header set Location (...)

या

Header edit Location (...)

मुझे ऐसा कुछ नहीं मिला है।

2
क्या आप सीधे अपाचे से जुड़ रहे हैं, या कोई कैशिंग या प्रॉक्सी सर्वर इनबेट है जो हेडर बदल सकता है? ProxyPassReverse निर्देश स्थान हेडर ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ) भी बदल सकता है ।

हो सकता है कि कुछ प्रॉक्सी इनबॉइट हो, मुझे कल काम करने के लिए मिलते ही इस पर एक नज़र डालनी होगी।

@ जाकोब एगर - मुझे कहीं भी ProxyPassReverse निर्देश नहीं मिला है।
साइबर

1

रीराइटिटेलॉग को सक्षम करने के अलावा (यदि आपके पास httpd.conf को बदलने की पहुंच है) तो आपको इस साइट पर मौजूद एप्लिकेशन को समीकरण से हटा देना चाहिए। अस्थायी रूप से डिफ़ॉल्ट index.php (या जो भी इंडेक्स पेज आपके ऐप की सेवा कर रहा है) को हटाएं / बदलें यह सुनिश्चित करने के लिए कि यह इसका कारण नहीं है।

अनुप्रयोगों की कई रिपोर्टें (उदाहरण के लिए वर्डप्रेस) हैं, जिससे ये अपाचे डिफ़ॉल्ट पुनर्निर्देशित पृष्ठ दिखाई देते हैं यदि वे गलत हैं।

इसके अलावा, अपाचे कॉन्फिग की बाकी जाँच करें कि क्या कोई अन्य 'रीडायरेक्ट' निर्देश हैं जो परस्पर विरोधी हो सकते हैं।


एप्लिकेशन ठीक है, मैंने इसे एक अलग सर्वर और विभिन्न डोमेन (पूरे ऐप की प्रतिलिपि बनाई) पर आज़माया और यह ठीक काम किया। मुझे लगता है कि यह अपाचे विन्यास में कुछ है, लेकिन मैं यह पता नहीं लगा सकता कि क्या।

एप्लिकेशन ठीक हो सकता है, लेकिन इस सर्वर पर सेटअप के साथ भी विरोध हो सकता है। ऐसा लगता है कि आपका ऐप अभी उत्पादन में है, इसलिए मैं देख सकता हूं कि 'इसे अक्षम करना' आदर्श नहीं है। मज़े के लिए, आप खोज को सहायता के लिए एक ध्वज के रूप में पुनर्निर्देशन के अंत में एक क्वेरी स्ट्रिंग जोड़ सकते हैं - इसलिए / $ 1? Nowww = 1 या कुछ इसी तरह।
गाविन सी।

नहीं, यह उत्पादन में नहीं है।

ओह अच्छा है, तो सूचकांक फ़ाइल को 100% से बाहर स्थानांतरित करने के लिए चोट नहीं पहुंचा सकता है इसे समस्या के भाग के रूप में बाहर कर दें :)
गेविन सी

ओह, धिक्कार है, मेरे लिखने का मतलब यह था कि उत्पादन में टीआईएस आईएस है, यह कैसे खुश है :-)

0

क्या आप यह वैकल्पिक mod_rewrite कोड आज़मा सकते हैं:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

यह ठीक उसी तरह विफल रहा।

क्या आप रिवरलाइट को सक्षम कर सकते हैं और देख सकते हैं कि यह क्या है।
शुभ

और मैं वास्तव में ऐसा कैसे कर सकता हूं? :-)

कृपया यहाँ देखें: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog केवल एक चीज यह है कि यह निर्देश अपाचे विन्यास में नहीं जाता है ।htaccess में नहीं।
शुभ

1
मैंने अपनी Apache स्थापना में उसी नियम (जैसा कि मेरे उत्तर के ऊपर) की प्रतिलिपि बनाई है और आपके प्रश्न में आपके पास मौजूद समान कर्ल कमांड चलाया है और Location: http://www.domain.com/मेरे हेडर के हिस्से के रूप में मिला है इसलिए मेरे मामले हेडर और HTML दोनों एक ही डोमेन को दिखा रहे हैं www.domain.com। क्या आप ऊपर दिए गए अपने प्रश्न में प्रासंगिक access.log लाइनें भी पेस्ट कर सकते हैं?
शुभ

0

क्या आप [एनसी] के बजाय [एनसी] का उपयोग करने की कोशिश कर सकते हैं, इतना सरल हो सकता है


और फिर भी यह (काम पहले से ही करने की कोशिश की, नहीं था) नहीं है :-)

0

मुझे आशा है कि आपके पास सर्वर एक्सेस है, साइट दस्तावेज़ फ़ोल्डर के बाद पुनर्निर्देशित लाइन को जोड़ा गया

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

यदि आपके पास सर्वर तक पहुंच नहीं है, तो उस हिस्से को शुरू करने वाले हिस्से को बदलने / बदलने के लिए उन लाइनों को जोड़ें।

हो सकता है कि आप पुनर्निर्देशन से पहले "रिवरटाइंगाइन ऑन" जोड़ दें।


मैंने जोड़ा है RewriteEngine on, जैसा कि मैंने कहा, यह किसी अन्य सर्वर पर ठीक से काम करता है, बस इस पर नहीं।

AllowOverride सभी अपनी सर्वर कॉन्‍फ़िगर फ़ाइल में उन पंक्तियों को जोड़ने की अनुमति देते हैं

0

प्रयत्न:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]

0

Options +FollowSymLinksयदि आप एक निर्देशिका संदर्भ में काम कर रहे हैं तो सुनिश्चित करें ।

अन्यथा यदि आप नाम आधारित वर्चुअल होस्ट का उपयोग कर रहे हैं, तो प्रयास करें:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

मैंने VirtualHost की परिभाषा के साथ सवाल अपडेट किया है।

क्या आपने उपरोक्त कई VirtualHost सॉल्यूशन को आजमाया या आप mod_rewrite का उपयोग करने के लिए तैयार हैं?
क्रिस

झगड़े में, मैं कई VirtualHosts का उपयोग नहीं करना चाहता था, लेकिन परिस्थितियों को देखते हुए मैंने इसे वैसे भी आजमाया और इससे कोई मदद नहीं मिली।

0

सभी उत्तरों को पढ़ने के बाद आप डी / आदि / होस्ट फ़ाइल की जांच कर सकते हैं ... हो सकता है कि आपके सभी चेक आपके कंप्यूटर से हों। किसी अन्य स्थान से पहुंचने का प्रयास करें।


नहीं, उस डोमेन के बारे में मेजबानों में कुछ भी नहीं है।

0

मेरे पास एक दूसरा विचार है। आपके द्वारा पोस्ट किया गया सर्वर लॉग "192.168.1.221" का पता दिखाता है, जो स्थानीय नेटवर्क का एक एड्रेस है। क्या सभी लॉग प्रविष्टियाँ समान IP पता दर्शाती हैं? यदि यह स्थिति है, तो आपके और सर्वर के बीच एक प्रॉक्सी है। यह प्रॉक्सी शायद हेडर को बदलने ProxyPassReverseया Header editबदलने के लिए उपयोग करता है Location

यह समस्या को दरकिनार करने के लिए एक सामान्य सेटअप है जब बैकएंड सर्वर अपने स्वयं के होस्टनाम को Locationहेडर में डालता है , बजाय बाहरी प्रॉक्सी सर्वर के होस्टनाम के।

यदि वास्तव में एक प्रॉक्सी सर्वर है, तो आपको बैकएंड सर्वर के कॉन्फ़िगरेशन के बजाय प्रॉक्सी सर्वर के कॉन्फ़िगरेशन को बदलना होगा, क्योंकि प्रॉक्सी हमेशा जानकारी को अधिलेखित करेगा।

इसका मतलब है कि हर समय हम गलत सर्वर को देख रहे हैं: समस्या प्रॉक्सी सर्वर के साथ है!


कल मैं इस सर्वर को चलाने वाली कंपनी का तकनीकी समर्थन कह रहा हूं। मुझे लगता है कि यह होना चाहिए, मैं तुम्हें बता दूँगा।
सायबर

0

.htaccessफ़ाइल में अशक्त वर्ण जैसे अशक्त हो सकता है ।

hexdump -C .htaccess

0

मेरा मानना ​​है कि आपके पुनर्लेखन की स्थिति के बाद आपको एक $ चिन्ह याद आ रहा है। प्रयास करें:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.