.htaccess không chuyển hướng đến trang có tiền tố www đúng cách


9

Tôi đang cố gắng chuyển hướng một url mà không có www. đến www.version (example.com đến www.example.com). Tôi sử dụng thông thường

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

Điều này hoạt động trên tất cả các dự án khác của tôi. Tuy nhiên trên trang web cụ thể này, nó kết thúc bằng một vòng lặp chuyển hướng. Đây là phần kỳ lạ: Tôi đã cố gắng cuộn tròn phiên bản không có www để xem những tiêu đề mà nó gửi bằng cách sử dụng curl --get http://example.com --dump-header domain.header > domain.html. Tệp tiêu đề trông như thế này:

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

Tuy nhiên, tệp HTML kết quả là thế này:

<!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>

(lưu ý sự khác biệt về địa chỉ giữa các tệp) Có ai biết cách khắc phục điều này không (và cái quái gì đang gây ra nó)? Bất kỳ chỉ thị viết lại url khác hoạt động tốt.

EDIT: ghi lại nhật ký chứa điều này: (trang web được nhiều người truy cập nên nhật ký viết lại khá dài, tôi không chắc chắn 100% nếu đây là phần phù hợp)

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]

Dòng nhật ký truy cập (có thể là bên phải):

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"

Định nghĩa của 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: okay, tôi chỉ cần tìm ra rằng nếu tôi làm điều này (đã từ chức và cố gắng chuyển hướng này mà không có .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');

Nó gây ra CHÍNH XÁC vòng lặp chuyển hướng CÙNG . Nghiêm túc, cái quái gì? Có ai có ý tưởng những gì có thể gây ra điều này?


Bạn đã tự biên dịch Apache hay chưa? Không nên để tiêu đề Vị trí khác với tiêu đề trong trang vì chúng được lấy từ cùng một biến trong trường hợp này, vì vậy điều đó khá kỳ quặc. Tôi giả sử rằng các yêu cầu được chuyển trực tiếp đến Apache, phải không, không có máy chủ nào khác nằm giữa?
Tim Stone

Tôi đã không tự biên dịch apache và không có máy chủ nào khác ở giữa.

có lẽ máy chủ NS của bạn không được cấu hình đúng cách
venimus

4
Không cần lặp lại tên máy chủ trong mục ServerAlias.
chris

bạn có thể đặt tất cả nội dung của tập tin ở đây không
hoàn tác vào

Câu trả lời:


2

Điều gây ấn tượng với tôi là kỳ quặc là Location: http://domain.cz/dòng tiêu đề được báo cáo bởi CURL. Bạn không bao giờ chuyển hướng đến tên miền đó. Nhật ký chuyển hướng cũng không chứa bất kỳ đề cập nào về nó.

Bằng cách nào đó, Locationtiêu đề dường như bị thay đổi sau khi modrewrite thực hiện công việc của nó và vì bạn cũng đã cố gắng thay đổi tiêu đề bằng PHP, nên Locationtiêu đề rõ ràng đã bị thay đổi sau khi yêu cầu được xử lý. Giải thích duy nhất tôi có thể nghĩ là bạn đang sửa đổi tiêu đề vị trí bằng mod_header ở đâu đó.

Bạn đã kiểm tra tất cả các tệp cấu hình (httpd.conf, các tệp .conf được bao gồm và tệp .htaccess) nếu bạn tìm thấy một dòng tương tự như sau:

Header set Location (...)

hoặc là

Header edit Location (...)

Tôi chưa tìm thấy thứ gì như thế này.

2
Bạn có đang kết nối trực tiếp với Apache không, hoặc có một số máy chủ bộ nhớ cache hoặc proxy nằm giữa có thể thay đổi tiêu đề không? Lệnh ProxyPassReverse cũng có thể thay đổi tiêu đề vị trí ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).

có thể có một số proxy ở giữa, tôi sẽ xem xét nó ngay khi tôi đi làm vào ngày mai.

@Jakob Egger - Tôi chưa tìm thấy chỉ thị ProxyPassReverse ở bất cứ đâu.
cypher

1

Ngoài việc cho phép viết lại (nếu bạn có quyền truy cập để thay đổi httpd.conf), bạn nên xóa ứng dụng sống trên trang web này khỏi phương trình. Xóa / đổi tên tạm thời index.php mặc định (hoặc bất kỳ trang chỉ mục nào đang phục vụ ứng dụng của bạn) để đảm bảo rằng nó không gây ra điều này.

Có nhiều báo cáo về các ứng dụng (ví dụ wordpress) khiến các trang chuyển hướng mặc định apache này xuất hiện nếu chúng bị định cấu hình sai.

Ngoài ra, hãy kiểm tra phần còn lại của cấu hình apache để xem liệu có bất kỳ hướng dẫn 'chuyển hướng' nào khác có thể xung đột hay không.


Ứng dụng này ổn, tôi đã thử nó trên một máy chủ khác và tên miền khác (sao chép toàn bộ ứng dụng) và nó hoạt động ổn. Tôi đoán đó là một cái gì đó trong cấu hình apache, nhưng tôi không thể tìm ra cái gì.

Ứng dụng có thể ổn, nhưng cũng có thể xung đột với thiết lập trên máy chủ này . Có vẻ như ứng dụng của bạn hiện đang được sản xuất nên tôi có thể thấy cách 'vô hiệu hóa nó' không lý tưởng. Để giải trí, bạn có thể thêm một chuỗi truy vấn vào cuối chuyển hướng dưới dạng cờ để hỗ trợ khám phá - vì vậy / $ 1? Nowww = 1 hoặc một cái gì đó tương tự.
Gavin C

Không, nó KHÔNG có trong sản xuất.

Thật tuyệt, sau đó không thể làm tổn thương để di chuyển tệp chỉ mục ra khỏi 100% để loại trừ nó như là một phần của vấn đề :)
Gavin C

Ôi, chết tiệt, điều tôi muốn viết là đây là sản phẩm, dunno làm thế nào điều này xảy ra :-)

0

Bạn có thể thử mã mod_rewrite thay thế này không:

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

Điều này thất bại chính xác theo cùng một cách.

bạn có thể kích hoạt RewriteLog và xem những gì nó phun ra.
anubhava

Và chính xác làm thế nào tôi có thể làm điều đó? :-)

Vui lòng xem tại đây: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Điều duy nhất là lệnh này đi vào cấu hình apache KHÔNG trong .htaccess.
anubhava

1
Tôi đã sao chép cùng một quy tắc (như câu trả lời của tôi ở trên) vào bản cài đặt Apache của tôi và chạy cùng một lệnh curl mà bạn có trong câu hỏi của mình và nhận được Location: http://www.domain.com/như một phần của tiêu đề của tôi, vì vậy trong tiêu đề trường hợp của tôi và cả hai đều hiển thị cùng một tên miền www.domain.com. Bạn cũng có thể dán các dòng access.log có liên quan trong câu hỏi của bạn ở trên không?
anubhava

0

bạn có thể thử sử dụng [NC] thay vì [nc] không, có thể rất đơn giản


Nhưng nó không phải là :-) (đã thử, không hoạt động)

0

Tôi hy vọng bạn có quyền truy cập máy chủ, Đã thêm dòng chuyển hướng sau khi thư mục tài liệu trang được chỉ định theo sau

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

Nếu bạn không có quyền truy cập cho máy chủ, hãy thêm những dòng đó trên omeaccess bắt đầu / thay đổi phần.

Có thể bạn chưa thêm "RewriteEngine vào" trước khi chuyển hướng.


Tôi đã thêm RewriteEngine on, như tôi đã nói, nó hoạt động trên một máy chủ khác, không phải trên máy chủ này.

AllowOverride Tất cả cho phép từ tất cả thêm các dòng đó vào tệp cấu hình máy chủ của bạn

0

Thử:

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

0

Hãy chắc chắn có Options +FollowSymLinksnếu bạn đang làm việc trong một bối cảnh thư mục.

Mặt khác, nếu bạn đang sử dụng máy chủ ảo dựa trên tên, hãy thử:

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

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

Tôi đã cập nhật câu hỏi với định nghĩa của Virtualhost.

Bạn đã thử nhiều giải pháp Virtualhost ở trên chưa, hoặc bạn đã bắt đầu sử dụng mod_rewrite chưa?
chris

Tại các hội chợ, tôi không muốn sử dụng nhiều Virtualhost, nhưng dù sao tôi cũng đã thử và nó không giúp được gì.

0

Sau khi đọc tất cả các câu trả lời, bạn có thể kiểm tra tập tin de / etc / hosts ... có thể tất cả các kiểm tra của bạn là từ máy tính của bạn. Cố gắng truy cập từ một địa điểm khác.


Không, không có gì trong máy chủ về miền đó.

0

Tôi có một ý tưởng thứ hai. Nhật ký máy chủ mà bạn đã đăng cho thấy một địa chỉ "192.168.1.221", là địa chỉ từ mạng cục bộ. Có phải tất cả các mục nhật ký hiển thị cùng một địa chỉ IP? Nếu đây là trường hợp, có một proxy giữa bạn và máy chủ. Proxy này có thể sử dụng ProxyPassReversehoặc Header editđể thay đổi Locationtiêu đề.

Đây là một thiết lập thông thường để khắc phục sự cố khi máy chủ phụ trợ đặt tên máy chủ của chính nó vào Locationtiêu đề, thay vì tên máy chủ của máy chủ proxy bên ngoài.

Nếu thực sự có một máy chủ proxy, bạn sẽ phải thay đổi cấu hình của máy chủ proxy thay vì cấu hình của máy chủ phụ trợ, vì proxy sẽ luôn ghi đè thông tin.

Điều này có nghĩa là tất cả thời gian chúng tôi đã nhìn vào máy chủ sai: Vấn đề là ở máy chủ proxy!


Ngày mai tôi sẽ gọi hỗ trợ kỹ thuật của công ty điều hành máy chủ này. Tôi nghĩ rằng nó phải là nó, tôi sẽ cho bạn biết.
cypher

0

Có thể là ký tự không thể in được như null trong .htaccesstệp.

hexdump -C .htaccess

0

Tôi tin rằng bạn đang thiếu dấu $ sau điều kiện viết lại của bạn. Vui lòng thử:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.