Ký tự an toàn cho url thân thiện [đã đóng]


168

Tôi cần tạo một trang web sẽ có bài viết và tôi muốn tạo các URL thân thiện cho nó, ví dụ: URL của trang có

Tiêu đề: Bài kiểm tra

nên trở thành : http://www.example.com/articles/article_test.

Tất nhiên tôi cần xóa một số ký tự khỏi tiêu đề như ?hoặc #, nhưng tôi không chắc nên xóa những ký tự nào.

Ai đó có thể cho tôi biết những nhân vật an toàn để giữ?


Có một câu hỏi tương tự, ở đây . Kiểm tra xem, bạn cũng có thể tìm thấy một số câu trả lời hữu ích ở đó (có khá nhiều trong số chúng).
Rook

Câu trả lời:


210

Để trích dẫn phần 2.3 của RFC 3986 :

"Các ký tự được cho phép trong URI nhưng không có mục đích dành riêng được gọi là không được giám sát. Chúng bao gồm chữ hoa và chữ thường, chữ số thập phân, dấu gạch nối, dấu chấm, dấu gạch dưới và dấu ngã."

ALPHA  DIGIT  "-" / "." / "_" / "~"

Lưu ý rằng RFC 3986 liệt kê các dấu chấm câu dành riêng ít hơn RFC 2396 cũ .


@Skip Head, "ký tự" có bao gồm các ký tự được mã hóa Latin như çõkhông?
Mohamad

6
@Mohamad: Không, chỉ ASCII, mặc dù hỗ trợ UTF-8 đang trở nên tốt hơn.
Dietrich Epp

@Dietrich Epp, cảm ơn bạn. Tôi đoán nó không quan trọng nếu URL dành cho mục đích trang trí và SEO, như: www.mysite.com/[postId[/post-title-with-ç-and-õ
Mohamad

1
@Mohamad: Phần cuối cùng ở đó sẽ được thay đổi dưới mui xe thành post-title-with-%C3%A7-and-%C3%B5, nhưng nó vẫn sẽ hiển thị trên thanh vị trí của người dùng như post-title-with-ç-and-õ.
Dietrich Epp

7
Độc giả của bạn là người Bồ Đào Nha, vì vậy hãy sử dụng các ký tự Bồ Đào Nha.
Dietrich Epp

107

Có hai bộ ký tự bạn cần để ý: dành riêngkhông an toàn .

Các ký tự dành riêng là:

  • ký hiệu ("&")
  • đô la ("$")
  • dấu cộng ("+")
  • dấu phẩy (",")
  • dấu gạch chéo ("/")
  • Đại tràng (":")
  • bán đại tràng (";")
  • bằng ("=")
  • dấu chấm hỏi ("?")
  • Biểu tượng 'Tại' ("@")
  • bảng Anh ("#").

Các ký tự thường được coi là không an toàn là:

  • không gian (" ")
  • nhỏ hơn và lớn hơn ("<>")
  • mở và đóng ngoặc ("[]")
  • niềng răng mở và đóng ("{}")
  • ống ("|")
  • dấu gạch chéo ngược ("\")
  • dấu mũ ("^")
  • phần trăm ("%")

Tôi có thể đã quên một hoặc nhiều, điều đó dẫn đến việc tôi lặp lại câu trả lời của Carl V. Về lâu dài, có lẽ bạn nên sử dụng một "danh sách trắng" các ký tự được phép và sau đó mã hóa chuỗi thay vì cố gắng bám sát các ký tự không được máy chủ và hệ thống cho phép.


#là một ký tự dành riêng được sử dụng cho dấu trang trên một trang cụ thể, được tạo bằng cách có một thành phần HTML có thuộc tính tên hoặc thuộc tính id phù hợp (sans #-symbol).
TheLonelyGhost

Cảm ơn - Tôi đã cập nhật câu trả lời.
Gary.Ray

Dấu hỏi hiển thị ở đây là cả dành riêng và không an toàn - Tôi nghĩ rằng nó chỉ dành riêng, nhưng tôi có thể không chính xác
Jonathan Basile

6
Những người khác dường như không đồng ý rằng dấu ngã ~không an toàn. Bạn có chắc chắn không?
DRS

3
Danh sách trắng không tốt lắm nếu xử lý các ngôn ngữ khác ngoài tiếng Anh. Unicode chỉ có quá nhiều điểm mã OK. Do đó, danh sách đen những người không an toàn có thể là dễ thực hiện nhất trong các biểu thức thông thường.
Patanjali

41

Tốt nhất bạn chỉ giữ một số ký tự (danh sách trắng) thay vì xóa một số ký tự (danh sách đen).

Về mặt kỹ thuật, bạn có thể cho phép bất kỳ ký tự nào, miễn là bạn mã hóa chính xác nó. Nhưng, để trả lời theo tinh thần của câu hỏi, bạn chỉ nên cho phép những nhân vật này:

  1. Chữ thường (chuyển chữ hoa sang chữ thường)
  2. Số, 0 đến 9
  3. Dấu gạch ngang - hoặc gạch dưới _
  4. Dấu ngã ~

Mọi thứ khác đều có một ý nghĩa đặc biệt. Ví dụ: bạn có thể nghĩ rằng bạn có thể sử dụng +, nhưng nó có thể được thay thế bằng khoảng trắng. & cũng nguy hiểm, đặc biệt nếu sử dụng một số quy tắc viết lại.

Cũng như các ý kiến ​​khác, hãy kiểm tra các tiêu chuẩn và thông số kỹ thuật để biết chi tiết đầy đủ.


15
Một preiod, tôi phát hiện ra hôm nay, là một lựa chọn không tốt về ký tự được sử dụng cho bộ mã hóa Base64 an toàn URL, bởi vì sẽ có những trường hợp hiếm hoi mà dữ liệu được mã hóa của bạn có thể tạo ra hai dấu chấm liên tiếp (".."), có ý nghĩa trong nó đề cập đến thư mục cha.
pohl

5
@pohl: đó chỉ là vấn đề nếu URL của bạn được sử dụng làm đường dẫn tệp, trong mã của bạn hoặc nếu máy chủ web của bạn thực sự cố gắng ánh xạ URL tới các tệp trước khi chuyển yêu cầu tới tập lệnh (rất tiếc là rất phổ biến).
André Caron

4
Trên thực tế, trong trường hợp của chúng tôi, sử dụng nó làm đường dẫn tệp sẽ ổn, vì trong các tệp unix được phép có nhiều dấu chấm, và thậm chí liên tiếp, trong tên của chúng. Đối với chúng tôi, vấn đề nảy sinh trong một công cụ giám sát có tên Site Scope có lỗi (có lẽ là một biểu thức ngây thơ) và nó đã báo cáo các thời gian ngừng hoạt động giả. Đối với chúng tôi, chúng tôi bị mắc kẹt trên một phiên bản cũ của Phạm vi trang web, nhóm quản trị viên từ chối trả tiền để nâng cấp và một khách hàng rất quan trọng có Phạm vi trang web (không tương đương) được ghi trong hợp đồng của họ. Phải thừa nhận rằng, hầu hết sẽ không thấy mình trong đôi giày của tôi.
pohl

8
Cảm ơn chúa vì ai đó đã đăng một danh sách mà không có nhiều lời trách móc. Đối với dấu chấm (.) - như @pohl đã nói, đừng sử dụng nó! Đây là một trường hợp kỳ lạ khác trên IIS (không biết điều này có xảy ra trên các Máy chủ web khác không): nếu nó ở cuối URL của bạn, rất có thể bạn sẽ gặp lỗi 404 (nó sẽ cố gắng tìm kiếm [/ pagename] . trang)
nikib3ro

34

Luôn an toàn

Đây là an toàn (về lý thuyết / thông số kỹ thuật), về cơ bản bất cứ nơi nào ngoại trừ tên miền.
Phần trăm mã hóa bất cứ thứ gì không được liệt kê, và bạn tốt để đi.

    A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;

Đôi khi an toàn

Chỉ an toàn khi được sử dụng trong các thành phần URL cụ thể; sử dụng cẩn thận.

    Paths:     + & =
    Queries:   ? /
    Fragments: ? / # + & =
    

Không bao giờ an toàn

Theo thông số URI (RFC 3986), tất cả các ký tự khác phải được mã hóa theo phần trăm. Điêu nay bao gôm:

    <space> <control-characters> <extended-ascii> <unicode>
    % < > [ ] { } | \ ^
    

Nếu khả năng tương thích tối đa là một mối quan tâm, hãy giới hạn bộ ký tự ở AZ az 0-9 - _.
(với các khoảng thời gian chỉ dành cho phần mở rộng tên tệp).

Giữ bối cảnh trong tâm trí

Ngay cả khi hợp lệ cho mỗi thông số, một URL vẫn có thể "không an toàn", tùy thuộc vào ngữ cảnh. Chẳng hạn như một tệp: /// URL chứa các ký tự tên tệp không hợp lệ hoặc thành phần truy vấn có chứa "?", "=" Và "&" khi không được sử dụng làm dấu phân cách. Việc xử lý chính xác các trường hợp này thường tùy thuộc vào kịch bản của bạn và có thể được xử lý, nhưng đó là điều cần lưu ý.


Bạn có thể cung cấp bất kỳ nguồn nào cho khiếu nại thứ hai của mình ("Đôi khi an toàn") không? Cụ thể, tôi tin rằng bạn đã sai khi nói rằng =không an toàn cho các truy vấn. Ví dụ: FIQL chấp nhận các dấu bằng nhau và tự mô tả là "thân thiện với URI" và "được tối ưu hóa và dự định sử dụng trong thành phần truy vấn". Theo cách hiểu của tôi, RFC 3986 cho phép rõ ràng "=", "&", "+" và những người khác trong các truy vấn.
DanielM

@DanielM "?", "=" Và "&" là hợp lệ trong các truy vấn trên mỗi thông số, mặc dù trong thực tế, chúng được sử dụng rộng rãi để phân tích các cặp giá trị tên trong truy vấn. Vì vậy, chúng có thể không an toàn như là một phần của chính tên / giá trị. Điều này có cấu thành "không an toàn" hay không có thể là vấn đề quan điểm.
Beejor

Một số nguồn, theo yêu cầu. (1) Các thành phần truy vấn RFC 3986, Sec 3.4: "[...] thường được sử dụng để mang thông tin nhận dạng dưới dạng các cặp 'key = value' [...]" (2) SpecWG URL Spec, Sec. 6.2: "Xây dựng và params.toString() // "key=730d67"xâu chuỗi một đối tượng URLSearchParams khá đơn giản: [...] " (3) Hướng dẫn PHP, http-build-query: "Tạo chuỗi truy vấn được mã hóa URL. [...] Ví dụ trên sẽ xuất ra: 0=foo&1=bar[...]"(4) J. Starr, Perishable Press:" Khi xây dựng các trang web, thường cần phải thêm các liên kết yêu cầu các chuỗi truy vấn được tham số hóa. "
Beejor

@Beejor: Tôi đang xây dựng một URL và tôi sử dụng '-' và ';' Trong quá trình xây dựng. Nó không phải là một ứng dụng web mà là một ứng dụng di động. Không phải là nhà phát triển web và do đó, tôi có an toàn không nếu tôi sử dụng hai ký tự trên trong thuộc tính Đường dẫn? docs.microsoft.com/en-us/dotnet/api/ từ
karsnen

1
@karsnen Đó là những ký tự URL hợp lệ. Mặc dù nếu được sử dụng để tham chiếu các đường dẫn trên một hệ thống tệp cục bộ, hãy nhớ rằng một số hệ thống không cho phép một số ký tự nhất định trong tên tệp. Ví dụ: "file: /// path / to / my: file.ext" sẽ không hợp lệ trên Mac.
Beejor

17

Nhìn vào RFC3986 - Mã định danh tài nguyên đồng nhất (URI): Cú pháp chung , câu hỏi của bạn xoay quanh thành phần đường dẫn của URI.

    foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose

Trích dẫn phần 3.3, các ký tự hợp lệ cho một URI segmentcó kiểu pchar:

pchar = unreserved / pct -oding / sub-delims / ":" / "@"

Mà phá vỡ để:

ALPHA / DIGIT / "-" / "." / "_" / "~"

pct-encoded

"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

":" / "@"

Hay nói cách khác: Bạn có thể sử dụng bất kỳ (không control) nhân vật từ các bảng mã ASCII , ngoại trừ / , ?, #, [] .

Sự hiểu biết này được hỗ trợ bởi RFC1738 - Bộ định vị tài nguyên thống nhất (URL) .


2
Đây là một ví dụ tuyệt vời về câu trả lời đúng về mặt lý thuyết, dẫn đến rắc rối khi áp dụng vào thế giới thực mà chúng ta thực sự sống. Đúng là hầu hết những nhân vật đó sẽ không gây ra vấn đề trong hầu hết thời gian. Nhưng tồn tại trong thế giới thực những thứ như proxy, bộ định tuyến, cổng, rơle, v.v., tất cả đều "thích" kiểm tra và tương tác với các URL theo cách coi thường tiêu chuẩn lý thuyết. Để tránh những cạm bẫy này, bạn bị hạn chế khá nhiều trong việc thoát khỏi mọi thứ trừ chữ số, dấu gạch ngang, dấu gạch dưới và dấu chấm.
deltamind106

1
@ deltamind106 Bạn có thể cung cấp các ví dụ và / hoặc tài liệu tham khảo để làm rõ những nhân vật nào an toàn theo RFC trên thực tế không? Tôi thích bám vào các sự kiện được hỗ trợ bởi các tiêu chuẩn trong câu trả lời của tôi và tôi rất vui khi cập nhật câu trả lời của mình nếu bạn có thể xác định bất kỳ sự thật nào tôi có thể đã bỏ qua.
Philzen

2
@ deltamind106 Tôi đề nghị chúng tôi cố gắng để sản phẩm tuân theo các tiêu chuẩn thay vì nói với các nhà phát triển không. Tôi xem xét cảnh báo của bạn là có công, nhưng chúng ta nên tham gia báo cáo việc không tuân thủ các nhà cung cấp nếu cần thiết.
Lo-Tân

@Philzen: Tôi đang xây dựng một URL và tôi sử dụng '-' và ';' Trong quá trình xây dựng. Nó không phải là một ứng dụng web mà là một ứng dụng di động. Không phải là nhà phát triển web và do đó, tôi có an toàn không nếu tôi sử dụng hai ký tự trên trong thuộc tính Đường dẫn? docs.microsoft.com/en-us/dotnet/api/ từ
karsnen

1
@karsnen Có tất nhiên -;an toàn, đó là những gì câu trả lời của tôi và RFC nêu rõ.
Philzen

12

không đáp ứng = ALPHA / DIGIT / "-" / "." / "_" / "~"


3
Không "ALPHA" có nghĩa là "DIGIT"? Tôi giả sử ALPHA là viết tắt của "chữ và số" và chữ và số có nghĩa là chữ hoa, chữ thường và chữ số.
Luc

11
Thật ra alpha không bao hàm chữ và số. Alpha và số là 2 thứ riêng biệt và chữ và số là sự kết hợp của những thứ đó. Anh ta có thể viết câu trả lời của mình như vậy: ALPHANUMERIC / "-" / "." / "_" / "~"
Macroman

1
Ký hiệu ABNF cho 'không được giám sát' trong RFC 3986 liệt kê chúng một cách riêng biệt.
Patanjali

11

Từ bối cảnh bạn mô tả, tôi nghi ngờ rằng những gì bạn thực sự đang cố gắng thực hiện là một thứ gọi là 'sên SEO'. Thực hành phổ biến nhất được biết đến cho những người là:

  1. Chuyển đổi sang chữ thường
  2. Chuyển đổi toàn bộ chuỗi ký tự khác với az và 0-9 thành một dấu gạch nối (-) (không phải dấu gạch dưới)
  3. Xóa 'các từ dừng' khỏi URL, nghĩa là các từ không có ý nghĩa - có thể lập chỉ mục như 'a', 'an' và 'the'; Google 'dừng từ' cho danh sách mở rộng

Vì vậy, như một ví dụ, một bài báo có tiêu đề "Cách sử dụng! @% $ * Để thể hiện sự chửi thề trong truyện tranh" sẽ nhận được một loạt "sử dụng-đại diện-chửi thề-truyện tranh".


Có thực sự là một cách tiếp cận tốt để loại bỏ những "từ dừng" này khỏi url không? Công cụ tìm kiếm sẽ phạt một trang web vì điều này?
Paulo

Các công cụ tìm kiếm thường được cho là chỉ thừa nhận một phần URL và / hoặc giảm tầm quan trọng đối với các phần sau này, vì vậy bằng cách xóa các từ dừng những gì bạn đang làm là tối đa hóa số lượng từ khóa bạn nhúng vào URL mà bạn có cơ hội thực sự xếp hạng trên.
hỗn loạn

1
@chaos Bạn vẫn khuyên bạn nên tước StopWord, nếu bạn tính đến điều này: seobythesea.com/2008/08/google-stopword-patent Ngoài ra, bạn có thể đề xuất một danh sách các từ khóa tốt không? Đây là danh sách tốt nhất tôi tìm thấy cho đến nay - link-assistant.com/seo-stop-words.html
nikib3ro

@ kape123 Điều đó không giống như một danh sách rất tốt với tôi. "C" và "d" là các ngôn ngữ lập trình và rất nhiều từ khác cũng có ý nghĩa quan trọng. Có lẽ tôi chỉ cần loại bỏ những cái cơ bản: a, và, là, trên, hoặc, với, với.
mở

6

Định dạng cho một URI được xác định trong RFC 3986 . Xem phần 3.3 để biết chi tiết.


6

Từ góc độ SEO, dấu gạch ngang được ưa thích hơn so với dấu gạch dưới. Chuyển đổi thành chữ thường, loại bỏ tất cả các dấu nháy đơn, sau đó thay thế tất cả các chuỗi ký tự không chữ và số bằng một dấu gạch nối. Cắt bớt các dấu gạch nối thừa ra khỏi đầu và kết thúc.


3

Tôi đã có vấn đề tương tự, tôi muốn có các url đẹp và đi đến kết luận rằng tôi phải chỉ cho phép các chữ cái, chữ số, và _ trong các url. Điều đó là tốt, sau đó tôi đã viết một số regex tốt đẹp và tôi nhận ra rằng nó nhận ra tất cả các ký tự UTF8 không phải là chữ cái trong .NET và đã bị vặn. Điều này dường như là một vấn đề biết cho công cụ regex .NET. VÌ tôi đã nhận được giải pháp này:

private static string GetTitleForUrlDisplay(string title)
{
    if (!string.IsNullOrEmpty(title))
    {
        return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
    }
    return string.Empty;
}


/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we 
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
    string x = m.ToString();
    if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
    {
        return x.ToLower();
    }
    else
    {
        return "-";
    }
}

3
.NET regexes hỗ trợ unicode khá tốt. Bạn phải sử dụng các lớp ký tự unicode, ví dụ \ p {L} cho tất cả các chữ cái. Xem msdn.microsoft.com/en-us/l
Library / 20bw873z.aspx # C CategoryOrBlock

1

Tôi thấy rất hữu ích khi mã hóa url của mình thành an toàn khi tôi trả lại giá trị thông qua ajax / php thành một url sau đó được đọc lại bởi trang.

Đầu ra PHP với bộ mã hóa url cho ký tự đặc biệt &

//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";

//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;

//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.

setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);

Hy vọng bất cứ ai tìm thấy trích xuất mã nhỏ của tôi hữu ích! :)


0

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó như "Mã hóa URL" - mã hóa một URL để nó "an toàn" để sử dụng trên web:

Đây là một tài liệu tham khảo cho điều đó. Nếu bạn không muốn bất kỳ ký tự đặc biệt nào, chỉ cần xóa bất kỳ ký tự nào yêu cầu mã hóa URL:

http://www.w3schools.com/TAGS/ref_urlencode.asp


-4

Từ 3-50 ký tự. Có thể chứa chữ cái thường, số và ký tự đặc biệt - dấu chấm (.), Dấu gạch ngang (-), dấu gạch dưới (_) và ở tỷ lệ (@).


4
Bất kỳ tài liệu tham khảo cho điều đó?
dakab 23/2/2016
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.