2012-04-15 39 views
23
http://example.com/something/somewhere//somehow/script.js 

Dấu gạch chéo kép có làm bất kỳ điều gì ở phía máy chủ không? Tôi có một kịch bản phân tích các URL và tôi đã tự hỏi nếu nó sẽ phá vỡ bất cứ điều gì (hoặc thay đổi đường dẫn) nếu tôi thay thế nhiều dấu gạch chéo với một dấu gạch chéo đơn. Đặc biệt ở phía máy chủ, một số khung công tác như CodeIgniter và Joomla sử dụng các lược đồ url và định tuyến được phân đoạn. Tôi chỉ muốn biết nếu nó phá vỡ bất cứ điều gì.url với nhiều dấu gạch chéo về phía trước, nó có làm hỏng bất kỳ thứ gì không?

Trả lời

25

HTTP RFC 2396 xác định đường phân tách là dấu gạch chéo đơn.

Tuy nhiên, trừ khi bạn đang sử dụng một số loại viết lại URL (trong trường hợp quy tắc viết lại có thể bị ảnh hưởng bởi số lượng dấu gạch chéo), bản đồ uri dẫn tới đường dẫn trên đĩa, nhưng trong (nhiều nhất?) hệ thống (Linux/Unix, Windows), nhiều dấu phân tách đường dẫn trong một hàng không có bất kỳ ý nghĩa đặc biệt nào, vì vậy/path/to/foo và/path // đến //// foo cuối cùng sẽ ánh xạ tới cùng một tệp.

Một điều bổ sung có thể bị ảnh hưởng là lưu vào bộ nhớ cache. Vì cả hai trang trình duyệt và bộ nhớ cache của máy chủ (theo cài đặt bộ nhớ đệm), yêu cầu cùng một tệp nhiều lần qua hơi các URI khác nhau có thể ảnh hưởng đến bộ nhớ đệm (tùy thuộc vào triển khai máy chủ và ứng dụng khách).

+0

Bạn phải xem phần 3.3 của tài liệu bạn đã trích dẫn (hoặc RFC3986 đã lỗi thời, nhưng đồng ý với hành vi được thảo luận ở đây), được chỉ định thông qua ABNF cách 'path_segments' bao gồm ít nhất một đoạn mã' segment' có thể có độ dài trống. Điều này có nghĩa là các chuỗi ký tự như '//' hoàn toàn hợp lệ trong URI. – amn

+0

@amn Nó hợp lệ, không có vấn đề ở đây. Nhưng câu hỏi là liệu nó có thể phá vỡ bất cứ điều gì. Và nó có thể - nếu bạn sử dụng viết lại URL (ví dụ) – poncha

+3

Đây là một câu trả lời tuyệt vời! Rất tiếc, đó là bản sao của https: ///stackoverflow.com////////a/////10161264/////6618577 mặc dù ... –

10

URL không phải ánh xạ tới đường dẫn hệ thống tệp. Vì vậy, ngay cả khi // trong đường dẫn hệ thống tệp tương đương với /, bạn không thể đảm bảo điều này cũng đúng cho tất cả các URL.

2

xem xét việc kê khai của các quan path-absolutenon-terminal trong "RFC3986: Uniform Resource Identifier (URI): Generic Syntax" (quy định, như là điển hình, trong ABNF cú pháp):

path-absolute = "/" [ segment-nz *("/" segment) ] 

Sau đó xem xét việc kê khai segment một vài dòng tiếp tục xuống trong cùng một tài liệu:

segment  = *pchar 

Nếu bạn có thể đọc ABNF, dấu hoa thị (*) chỉ định rằng phần tử sau pchar có thể được lặp lại m tối đa lần để tạo thành một số segment, bao gồm số không. Học này và đọc lại tờ khai path-absolute ở trên, bạn có thể thấy rằng một khả năng trống segment imples rằng thứ hai "/" có thể lặp lại vô thời hạn, do đó cho phép kết hợp hợp lệ như ////// (chiều dài tùy ý của ít nhất một /) như một phần của path-absolute (mà chính nó được sử dụng trong việc xác định quy tắc mô tả một URI).

Vì tất cả các URL đều là URI, chúng tôi có thể kết luận rằng có, URL được cho phép nhiều dấu gạch chéo tiến tiếp theo, mỗi RFC được trích dẫn.

Nhưng không giống như mọi người theo dõi hoặc triển khai phân tích cú pháp URI theo đặc tả, vì vậy tôi khá chắc chắn rằng các trình phân tích cú pháp URI/URL không tuân thủ và tất cả các loại phần mềm xếp chồng lên nhau.

1

Một điều bạn có thể muốn xem xét là nó có thể ảnh hưởng đến việc lập chỉ mục trang của bạn trong công cụ tìm kiếm.Theo this trang web,

URL với đường dẫn tương tự lặp đi lặp lại 3 lần sẽ không được lập chỉ mục trong Google

Ví dụ họ sử dụng là:

example.com/path/path/path/ 

Tôi có không xác nhận điều này cũng sẽ đúng nếu bạn sử dụng example.com///, nhưng tôi chắc chắn sẽ muốn tìm hiểu xem tối ưu hóa SEO có quan trọng đối với trang web của tôi hay không.

Họ đề cập đến "Điều này là do Google nghĩ rằng nó đã đạt được một cái bẫy URL." Nếu bất cứ ai khác biết câu trả lời chắc chắn, vui lòng thêm nhận xét vào câu trả lời này; nếu không, tôi nghĩ rằng nó có liên quan để bao gồm trường hợp này để xem xét.

5

Câu trả lời đúng cho câu hỏi này là tùy thuộc vào việc triển khai máy chủ!

Dấu gạch chéo kép có giá trị theo cú pháp theo RFC 2396, xác định cú pháp đường dẫn URL và như được giải thích ngụ ý một phân đoạn URI trống rỗng, và amn. Lưu ý rằng RFC 2396 chỉ xác định cú pháp, không phải ngữ nghĩa của đường dẫn, bao gồm các phân đoạn đường dẫn trống, do đó, tùy thuộc vào máy chủ của bạn để quyết định.

Bạn đã không đề cập đến ngăn xếp phần mềm máy chủ bạn đang sử dụng, có lẽ bạn thậm chí còn đang cuộn của riêng mình?

Dù bằng cách nào, tôi muốn chỉ ra một số lý do thực tế có nghĩa là bạn có thể muốn tránh dấu gạch chéo đôi mặc dù họ là cú pháp hợp lệ:

  1. Kể từ khi có sản phẩm nào là hợp lệ không được mong đợi của mọi người, nó gây ra lỗi. Và ngay cả khi công nghệ máy chủ của bạn ngày hôm nay có thể tương thích với nó, nhưng công nghệ máy chủ tiếp theo, hoặc thậm chí phiên bản tiếp theo của công nghệ máy chủ hiện tại của bạn có thể quyết định không hỗ trợ nó (ví dụ: thư viện API ASP.NET MVC Web ném một lỗi khi bạn thử để chỉ định mẫu tuyến đường với dấu gạch chéo kép).

  2. Một số máy chủ thậm chí có thể diễn giải // như chỉ báo quay lại đường dẫn gốc. Này hoặc có thể vào mục đích, hoặc một lỗi ...

  3. Bởi vì nó là đôi khi một lỗi, một số ngăn xếp máy chủ và tường lửa do đó giả // là một nỗ lực tại khai thác lỗi (cho dù nó thực sự là một lỗi hay không), tức là một cuộc tấn công traversal thư mục, và cung cấp cho bạn 403 Forbidden trả trước trước khi giải thích đường dẫn URI.

0

Câu hỏi của bạn là "nó có làm hỏng bất kỳ thứ gì không". Xét về đặc tả URL, nó không hoạt động. Đừng đọc RFC, đây là một thử nghiệm nhanh bạn có thể thử:

cat > tmp.php <<'EOF' 
<?php 
echo $_SERVER['REQUEST_URI']; 
EOF 
php -S localhost:4000 tmp.php 

Bây giờ mở trình duyệt của bạn để http://localhost:4000/hello//world

0

Bạn có thể ngạc nhiên ví dụ như khi xây dựng liên kết cho các nguồn lực trong ứng dụng của bạn.

<script src="mysite.com/resources/jquery//../angular/script.js"></script> 

sẽ không giải quyết đểmysite.com/resources/angular/script.jsnhưng đểmysite.com/resources/jquery/angular/script.jsnhững gì bạn có thể không muốn

slashes đúp là ác, cố gắng tránh chúng.

Các vấn đề liên quan