. htaccess ไม่เปลี่ยนเส้นทางไปยังหน้า www-prefixed อย่างถูกต้อง


9

ฉันกำลังพยายามเปลี่ยนเส้นทาง URL ที่ไม่มี www ไปที่ 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>

แก้ไข 2:โอเคฉันเพิ่งรู้ว่าถ้าฉันทำ (ลาออกและพยายามที่จะเปลี่ยนเส้นทางนี้โดยไม่ต้อง. htaccess):

//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');

มันทำให้เกิดการวนรอบการเปลี่ยนเส้นทางเดียวกัน อย่างจริงจังสิ่งที่นรก? ใครบ้างมีความคิดว่าอาจเป็นสาเหตุของเรื่องนี้


คุณรวบรวม Apache ด้วยตัวเองหรือ มันเป็นไปไม่ได้ที่ส่วนหัว Location จะแตกต่างจากสิ่งที่อยู่ในหน้าเนื่องจากมันถูกนำมาจากตัวแปรเดียวกันในกรณีนี้ดังนั้นมันจึงค่อนข้างแปลก ฉันคิดว่าคำขอจะถูกส่งโดยตรงไปยัง Apache ใช่ไม่มีเซิร์ฟเวอร์อื่นที่อยู่ระหว่าง
Tim Stone

ฉันไม่ได้รวบรวม apache ด้วยตนเองและไม่มีเซิร์ฟเวอร์อื่นที่อยู่ระหว่างนั้น

อาจเป็นเพราะเซิร์ฟเวอร์ NS ของคุณไม่ได้รับการกำหนดค่าอย่างเหมาะสม
venimus

4
ไม่จำเป็นต้องทำซ้ำชื่อเซิร์ฟเวอร์ในรายการ ServerAlias
chris

คุณสามารถใส่เนื้อหาทั้งหมดของไฟล์ไว้ที่นี่ได้ไหม
เลิกทำ

คำตอบ:


2

สิ่งที่ทำให้ฉันประหลาดเป็นLocation: http://domain.cz/ส่วนหัวที่รายงานโดย CURL คุณไม่เคยเปลี่ยนเส้นทางไปยังโดเมนนั้น บันทึกการเปลี่ยนเส้นทางยังไม่มีการกล่าวถึงใด ๆ

อย่างใดLocationส่วนหัวดูเหมือนว่าจะมีการเปลี่ยนแปลงหลังจาก modrewrite ทำสิ่งที่มันและเนื่องจากคุณพยายามเปลี่ยนส่วนหัวด้วย PHP เช่นกันLocationส่วนหัวจะเห็นได้ชัดว่ามีการเปลี่ยนแปลงหลังจากที่มีการประมวลผลคำขอ คำอธิบายเดียวที่ฉันคิดได้ก็คือคุณกำลังแก้ไขส่วนหัวของตำแหน่งด้วย mod_header ที่ไหนสักแห่ง

คุณตรวจสอบไฟล์การกำหนดค่าทั้งหมด (httpd.conf, ไฟล์. conf ที่รวมอยู่และไฟล์. htaccess) หรือไม่หากคุณพบบรรทัดที่คล้ายกับที่นี่:

Header set Location (...)

หรือ

Header edit Location (...)

ฉันไม่พบอะไรเช่นนี้

2
คุณกำลังเชื่อมต่อกับ Apache โดยตรงหรือมีแคชหรือพร็อกซีเซิร์ฟเวอร์ในระหว่างที่อาจมีการเปลี่ยนแปลงส่วนหัว? ProxyPassReverse directive อาจเปลี่ยนส่วนหัวของตำแหน่ง ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse )

อาจมีพร็อกซีบางส่วนในระหว่างนี้ฉันจะดูทันทีที่ฉันไปทำงานในวันพรุ่งนี้

@Jakob Egger - ฉันไม่พบคำสั่ง ProxyPassReverse ทุกที่
เลขศูนย์

1

นอกเหนือจากการเปิดใช้งาน rewritelog (หากคุณมีสิทธิ์ในการเปลี่ยน httpd.conf) คุณควรลบแอปพลิเคชันที่อยู่บนไซต์นี้ออกจากสมการ ลบ / เปลี่ยนชื่อดัชนีเริ่มต้นชั่วคราว (หรือหน้าดัชนีใด ๆ ที่ให้บริการแอปของคุณ) ชั่วคราวเพื่อให้แน่ใจว่าจะไม่ทำให้เกิดสิ่งนี้

มีรายงานแอปพลิเคชันมากมาย (เช่น wordpress) ทำให้หน้าเปลี่ยนเส้นทางเริ่มต้นของ apache เหล่านี้ปรากฏขึ้นหากมีการกำหนดค่าผิดพลาด

ตรวจสอบส่วนที่เหลือของการกำหนดค่า apache เพื่อดูว่ามีคำแนะนำ 'การเปลี่ยนเส้นทาง' อื่น ๆ ที่อาจขัดแย้งกันหรือไม่


แอปพลิเคชันไม่เป็นไรฉันลองใช้เซิร์ฟเวอร์อื่นและโดเมนอื่น (คัดลอกทั้งแอป) และทำงานได้ดี ฉันเดาว่ามันเป็นอะไรบางอย่างในการกำหนดค่า apache แต่ฉันไม่สามารถหาอะไรได้

แอปพลิเคอาจจะ ok แต่อาจจะยังขัดแย้งกับการตั้งค่าบนนี้เซิร์ฟเวอร์ ดูเหมือนว่าแอปของคุณกำลังใช้งานอยู่ในปัจจุบันดังนั้นฉันสามารถดูได้ว่า 'ปิดใช้งาน' ไม่เหมาะ เพื่อความสนุกคุณอาจเพิ่มสตริงข้อความค้นหาที่ส่วนท้ายของการเปลี่ยนเส้นทางเป็นธงเพื่อช่วยในการค้นพบ - ดังนั้น / $ 1? nowww = 1 หรือบางอย่างที่คล้ายกัน
Gavin C

ไม่มันไม่ได้อยู่ในการผลิต

โอ้เย็นแล้วไม่สามารถทำร้ายย้ายไฟล์ดัชนีออกจากทางถึง 100% ไม่รวมมันเป็นส่วนหนึ่งของปัญหาที่เกิดขึ้น :)
กาวิน C

โอ้ไอ้สิ่งที่ฉันหมายถึงการเขียนเป็นมอกที่อยู่ในการผลิต dunno วิธีนี้ happenned :-)

0

คุณลองใช้รหัส mod_rewrite อื่นได้ไหม:

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

สิ่งนี้ล้มเหลวในลักษณะเดียวกัน

คุณสามารถเปิดใช้งาน RewriteLog และดูสิ่งที่มันพ่นออกมา
anubhava

และฉันจะทำอย่างนั้นได้อย่างไร? :-)

โปรดดูที่นี่: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelogสิ่งเดียวคือคำสั่งนี้จะเข้าสู่การกำหนดค่า apache ไม่ได้อยู่ใน. htaccess
anubhava

1
ผมคัดลอกกฎเดียวกัน (เป็นคำตอบของฉันข้างต้น) การติดตั้ง Apache ของฉันและวิ่งคำสั่งขดเดียวกับที่คุณมีในคำถามของคุณและได้Location: http://www.domain.com/เป็นส่วนหนึ่งของส่วนหัวของฉันดังนั้นในกรณีของฉันส่วนหัวและ HTML www.domain.comทั้งมีการแสดงเช่นโดเมนเดียวกัน คุณสามารถวางบรรทัด access.log ที่เกี่ยวข้องในคำถามของคุณด้านบนได้หรือไม่
anubhava

0

คุณลองใช้ [NC] แทน [nc] ได้ไหม


และยังไม่ได้ :-) (พยายามแล้วไม่ได้ทำงาน)

0

ฉันหวังว่าคุณจะเข้าถึงเซิร์ฟเวอร์เพิ่มบรรทัดการเปลี่ยนเส้นทางหลังจากโฟลเดอร์เอกสารไซต์ที่ระบุไว้ติดตาม

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

หากคุณไม่มีสิทธิ์เข้าถึงเซิร์ฟเวอร์ให้เพิ่มบรรทัดเหล่านั้นในการเริ่มต้น / เปลี่ยนแปลงส่วน

อาจเป็นเพราะคุณไม่ได้เพิ่ม "RewriteEngine on" ก่อนการเปลี่ยนเส้นทาง


ฉันได้เพิ่มRewriteEngine onอย่างที่ฉันบอกว่ามันทำงานบนเซิร์ฟเวอร์อื่นได้อย่างเหมาะสมไม่ใช่ในเซิร์ฟเวอร์นี้

AllowOverride อนุญาตทั้งหมดจากทั้งหมดเพิ่มบรรทัดเหล่านั้นในไฟล์ปรับแต่งเซิร์ฟเวอร์ของคุณ


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
chris

ที่ firts ฉันไม่ต้องการใช้ VirtualHosts หลายอัน แต่ให้สถานการณ์ฉันลองต่อไปและมันก็ไม่ได้ช่วยอะไร

0

หลังจากอ่านคำตอบทั้งหมดคุณสามารถตรวจสอบไฟล์ de / etc / hosts ... เช็คทั้งหมดของคุณอาจมาจากคอมพิวเตอร์ของคุณ ลองเข้าถึงจากตำแหน่งอื่น


ไม่ไม่มีสิ่งใดในโฮสต์ที่เกี่ยวกับโดเมนนั้น

0

ฉันมีความคิดที่สอง บันทึกเซิร์ฟเวอร์ที่คุณโพสต์แสดงที่อยู่ของ "192.168.1.221" ซึ่งเป็นที่อยู่จากเครือข่ายท้องถิ่น รายการบันทึกทั้งหมดแสดงที่อยู่ IP เดียวกันหรือไม่ หากเป็นกรณีนี้จะมีพร็อกซีระหว่างคุณกับเซิร์ฟเวอร์ อาจใช้พร็อกซีนี้ProxyPassReverseหรือHeader editเปลี่ยนLocationส่วนหัว

นี่เป็นการตั้งค่าปกติเพื่อหลีกเลี่ยงปัญหาเมื่อเซิร์ฟเวอร์ด้านหลังใส่ชื่อโฮสต์ของตัวเองลงในLocationส่วนหัวแทนที่จะเป็นชื่อโฮสต์ของพร็อกซีเซิร์ฟเวอร์ภายนอก

หากมีพร็อกซีเซิร์ฟเวอร์จริงๆคุณจะต้องเปลี่ยนการกำหนดค่าพร็อกซีเซิร์ฟเวอร์แทนการกำหนดค่าของเซิร์ฟเวอร์แบ็กเอนด์เนื่องจากพร็อกซีจะเขียนทับข้อมูลเสมอ

ซึ่งหมายความว่าทุกครั้งที่เราดูเซิร์ฟเวอร์ผิด: ปัญหาเกิดขึ้นกับพร็อกซีเซิร์ฟเวอร์!


พรุ่งนี้ฉันกำลังโทรหาฝ่ายสนับสนุนด้านเทคนิคของ บริษัท ที่ดูแลเซิร์ฟเวอร์นี้ ฉันคิดว่าต้องเป็นอย่างนั้นฉันจะแจ้งให้คุณทราบ
Cypher


0

ฉันเชื่อว่าคุณไม่มีเครื่องหมาย $ หลังจากเงื่อนไขการเขียนใหม่ของคุณ กรุณาลอง:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.