Câu trả lời:
Đó là một lỗi trong mã của lập trình viên / nhà phát triển. Nếu bạn so sánh hai URL này:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
Chúng trông khác nhau nhưng nếu bạn ghé thăm, cả hai sẽ hoạt động trong hầu hết các trình duyệt hiện đại.
Đây là một cái gì đó bạn muốn sửa chữa. Nếu bạn có dấu gạch chéo kép, nó có thể gây nhầm lẫn cho trình thu thập dữ liệu web của Google và khiến họ nghĩ rằng có 2 phiên bản của trang.
Như được đề cập bởi @RandomBen , dấu gạch chéo kép rất có thể là kết quả của một lỗi ở đâu đó.
Việc tải trang không liên quan gì đến trình duyệt , mà là máy chủ bỏ qua dấu gạch chéo thừa. Trình duyệt không làm gì đặc biệt với các dấu gạch chéo bổ sung trong URL, nó chỉ gửi chúng theo yêu cầu:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
Có vẻ như cả hai phiên bản hiện tại của Apache và IIS sẽ bỏ qua các dấu gạch chéo bổ sung trong khi giải quyết đường dẫn và trả lại tài liệu đã được trả lại nếu URL không có dấu gạch chéo. Tuy nhiên , các trình duyệt (tôi đã kiểm tra IE 8 và Chrome 9) bị lẫn lộn bởi bất kỳ URL tương đối nào (chứa các thành phần đường dẫn chính) trong trang, điều này tạo ra kết quả xấu. Ví dụ: nếu một trang có:
<link rel="stylesheet" href="../../style.css" type="text/css" />
Khi tải trang /a/b/c/
, trình duyệt sẽ yêu cầu /a/style.css
. Nhưng nếu vì bất cứ lý do gì mà Wap /a/b//c/
được yêu cầu (và máy chủ bỏ qua dấu gạch chéo), trình duyệt sẽ kết thúc yêu cầu /a/b/style.css
, điều này sẽ không tồn tại. Rất tiếc, trang trông xấu xí.
(Điều này rõ ràng sẽ không xảy ra nếu URL không có thành phần đường dẫn cha ( ..
) hoặc là tuyệt đối.)
Đó là ý kiến của tôi rằng Apache và IIS (và có lẽ những người khác) đang hành động không đúng như /a/b/c/
và /a/b//c/
kỹ thuật đại diện cho hai nguồn khác nhau. Theo RFC 2396 , mọi dấu gạch chéo đều có ý nghĩa:
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
Vì vậy, /a/b/c/
bao gồm ba phân đoạn: "a", "b" và "c"; /a/b//c/
thực sự bao gồm bốn: "a", "b", "" (chuỗi trống) và "c". Có hay không chuỗi trống là một thư mục hệ thống tập tin hợp lệ là một chi tiết của nền tảng của máy chủ. (Và về mặt logic, điều này có nghĩa là các trình duyệt thực sự hoạt động chính xác khi phân tích URL tương đối bằng các thành phần đường dẫn cha mẹ - trong ví dụ của tôi, chúng đi qua thư mục "c" và thư mục "", để chúng tôi yêu cầu style.css
từ "b".)
Nếu bạn đang sử dụng Apache với mod_rewrite
, có một cách khắc phục khá đơn giản :
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Điều này sẽ đưa ra một 301 Moved Permanently
chuyển hướng HTTP để bất kỳ dấu gạch chéo kép nào bị tước khỏi URL.
mod_rewrite
giải pháp của bạn đưa vào tài khoản 3, 4, ... chém? Một cái gì đó dọc theo dòng /{2,}
? (Giả sử Apache cho phép loại định lượng đó, tôi không quá quen thuộc với nó)
a/b
và a//b
thực sự là hai đường dẫn URL riêng biệt, nhưng không có gì cấm máy chủ trả lại cùng một tài nguyên cho cả hai nếu muốn. Tôi đồng ý với bạn, tuy nhiên, trong thực tế, việc trả lại một chuyển hướng 301 có vẻ hữu ích hơn.
a//b
một thư mục (xem ví dụ về biểu định kiểu ở trên).
Dấu gạch chéo kép có ý nghĩa khi nó được sử dụng trong URL tài nguyên. Ví dụ: khi người dùng CSS sử dụng URL của hình nền:
.classname {
background : url("//example.com/a/b/c/d.png");
}
Ở đây nó có nghĩa là hình nền này được tìm nạp từ một tên miền khác ngoài tên miền của trang web hiện tại. Hay nói cách khác, http://
có thể được viết như chỉ //
khi sử dụng nó trong URL tài nguyên.
Nhưng dấu gạch chéo kép ở giữa URL (ví dụ /a//b/c/d.htm
:) không có nghĩa gì.
Như đã đề cập, một số máy chủ được thiết lập để bỏ qua dấu gạch chéo kép trong đường dẫn URL, nhưng lưu trữ tĩnh Amazon S3 sẽ không. Nếu bạn muốn xử lý / bỏ qua chúng trong trường hợp đó, bạn có thể sử dụng Quy tắc chuyển hướng trong bảng thuộc tính.
Nếu bạn muốn bỏ qua dấu gạch chéo kép sau tên miền thì bạn có thể sử dụng một cái gì đó như thế này:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
Bạn có thể cũng có thể tìm và thay thế chúng trong suốt, nhưng điều đó là đủ cho tôi.