Dấu gạch chéo kép có nghĩa là gì trong các URL?


32

Dấu gạch chéo đôi thường được tìm thấy trong URL có nghĩa là gì?

Ví dụ:

  • http://www.example.com/A/B//C/

Xin lưu ý rằng tôi không đề cập đến sự khởi đầu ngay sau đó http:.

Câu trả lời:


32

Đó 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.


11
Trên thực tế, 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. Điều này đã lâu, vì vậy hãy xem câu trả lời tôi đã đăng.
josh3736

33

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//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.csstừ "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 Permanentlychuyển hướng HTTP để bất kỳ dấu gạch chéo kép nào bị tước khỏi URL.


2
Sẽ không tốt hơn nếu mod_rewritegiả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ó)
Ward Muylaert

+1 - Cảm ơn bạn đã biết thêm thông tin. Tôi đã không nghĩ về nó theo cách đó!
Ben Hoffman

3
Đó không phải là hành vi không chính xác : a/ba//bthự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.
Ilmari Karonen

4
@IlmariKaronen: Đó hoàn toàn là hành vi không chính xác vì (1) hành vi này tự động tạo ra vô số tham chiếu trùng lặp tiềm năng cho một tài nguyên duy nhất (nếu không vi phạm thư của bất kỳ thông số nào, chắc chắn vi phạm tinh thần) và thực tế hơn (2) nó "phá vỡ" việc xử lý đường dẫn tương đối trong các trình duyệt đếm đúng chuỗi trống trong a//bmột thư mục (xem ví dụ về biểu định kiểu ở trên).
josh3736

1
... và dù sao đi nữa, tôi cho rằng RFC 2396 không cấm máy chủ trả lại cùng một tài nguyên bằng cách tự động đóng dấu gạch chéo vì thông số kỹ thuật nói rằng mọi dấu gạch chéo đều có ý nghĩa. Tự động bỏ qua các dấu gạch chéo liên tiếp là vi phạm thông số kỹ thuật đó. (Đó là một điều nếu ai đó lập trình máy chủ của họ để làm điều đó, ngay cả khi làm như vậy sẽ là ngớ ngẩn. Tuy nhiên, các máy chủ làm điều này theo mặc định không chính xác.)
josh3736

4

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ì.


tốt, đây không phải là toàn bộ sự thật. Dấu gạch chéo kép được tạo ra khi người ta cần tránh vấn đề nội dung hỗn hợp, do đó, khi trang web được tải từ http, d doublelash sẽ mở rộng thành http, khi trang web được tải từ https, d doublelash được mở rộng thành https.
andrej

2

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.

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.