พารามิเตอร์การสืบค้น url ถูกต้องหรือไม่หากไม่มีค่า


150

url http://example.com/foo?barถูกต้องหรือไม่

ฉันกำลังมองหาลิงก์ไปยังเว็บไซต์ที่เป็นทางการที่ระบุว่าไม่ทางใดก็ทางหนึ่ง คำตอบง่ายๆใช่ / ไม่ใช่หรือหลักฐานเล็กน้อยจะไม่ตัดมัน


3
นอกจาก URI RFC แล้วฉันยังต้องการชี้ให้เห็นถึงตัวอย่างในโลกแห่งความเป็นจริงของสิ่งนี้ Drupal ใช้พารามิเตอร์การสืบค้นที่ไร้ค่าเหล่านี้ในบางลิงก์เป็นรูปแบบของการป้องกันแคช เช่น www.google-analytics.com/analytics.js?o490ub หรือ /themes/seven/ie.css?o4eppb คุณอาจรู้เรื่องนี้อยู่แล้ว แต่บางคนอาจจะไม่สะดุด
Elijah Lynn

คำตอบ:


113
  • ใช้ได้กับ URI RFC
  • กรอบ / โค้ดฝั่งเซิร์ฟเวอร์ของคุณเป็นที่ยอมรับได้

URI RFCไม่อาณัติรูปแบบสตริงแบบสอบถาม แม้ว่าจะได้รับการยอมรับว่าสตริงการสืบค้นมักจะมีคู่ชื่อ - ค่า แต่ก็ไม่จำเป็นต้องมี (เช่นมักจะมี URI อื่น)

3.4. แบบสอบถาม

คอมโพเนนต์เคียวรีประกอบด้วยข้อมูลที่ไม่ใช่ลำดับชั้นที่พร้อมกับข้อมูลในองค์ประกอบพา ธ (ส่วนที่ 3.3) ทำหน้าที่ระบุทรัพยากรภายในขอบเขตของโครงร่างของ URI และอำนาจการตั้งชื่อ (ถ้ามี) ...

... อย่างไรก็ตามเนื่องจากคอมโพเนนต์เคียวรีมักใช้เพื่อดำเนินการระบุข้อมูลในรูปแบบของคู่ "คีย์ = ค่า" และค่าที่ใช้บ่อยค่าหนึ่งคือการอ้างอิงถึง URI อื่น ...

HTMLกำหนดว่าแบบฟอร์มที่ส่งผ่าน HTTP GET ควรเข้ารหัสค่าฟอร์มเป็นคู่ชื่อ - ค่าในรูปแบบ "? key1 = value1 & key2 = value2 ... " (เข้ารหัสอย่างถูกต้อง) การแยกวิเคราะห์สตริงเคียวรีขึ้นอยู่กับโค้ดฝั่งเซิร์ฟเวอร์ (เช่น Java servlet engine)

คุณไม่ได้ระบุว่าคุณใช้เฟรมเวิร์กฝั่งเซิร์ฟเวอร์ใด แต่เป็นไปได้ว่าเฟรมเวิร์กฝั่งเซิร์ฟเวอร์ของคุณอาจคิดว่าสตริงเคียวรีจะอยู่ในคู่ชื่อ - ค่าเสมอและอาจทำให้หายใจไม่ออกในสตริงแบบสอบถามที่ไม่ได้ ในรูปแบบนั้น (เช่น?bar) หากรหัสที่กำหนดเองของคุณเองในการแยกวิเคราะห์สตริงการสืบค้นคุณก็ต้องแน่ใจว่าคุณจัดการกับรูปแบบสตริงการสืบค้นดังกล่าว หากเป็นเฟรมเวิร์กคุณจะต้องศึกษาเอกสารของคุณหรือทดสอบเพื่อดูว่ามีการจัดการอย่างไร


8
ASP.NET MVC (รุ่นที่ 4 และ 5 สำหรับความรู้ของฉัน) ทำให้หายใจไม่ออกเมื่อไม่มีค่าที่ระบุ :(
AR

2
ความisindexมหัศจรรย์nameจาก HTML5 ช่วยให้สามารถส่งสตริงการสืบค้นโดยไม่มีรูปแบบคีย์ - ค่าstackoverflow.com/a/37579004/895245
Ciro Santilli 郝海东冠状病六四事件法轮功


85

ใช้ได้อย่างสมบูรณ์แบบ คุณสามารถพิจารณาว่าพวกเขาเทียบเท่ากับผู้ชายกล้ามโตที่ยืนเงียบ ๆ อยู่ข้างหลังกลุ่มผู้ส่งสาร ผู้ชายไม่มีชื่อและไม่พูด แต่การปรากฏตัวของเขาบ่งบอกถึงข้อมูล


21
นักเลงกล้ามโตมีชื่อคุณก็ไม่รู้ คุณรู้จักมันบนพารามิเตอร์และโดยพื้นฐานแล้วมันมีค่าบูลีน (ปัจจุบันไม่มีอยู่)
Vlasec

2
วิธีที่ดีที่สุดในการอธิบาย :)
Mohammad Kermani

1
ชื่อของคนตัวใหญ่คือCheichจากตอนปล้นคาสิโนใน Star Trek: Deep Space 9
Anthony Rutledge

10

"โครงร่าง" http "ใช้เพื่อค้นหาทรัพยากรเครือข่ายผ่านโปรโตคอล HTTP ส่วนนี้กำหนดไวยากรณ์และความหมายเฉพาะของโครงร่างสำหรับ http URLs" http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

ใช่สิ่งใดก็ใช้ได้หลังเครื่องหมายคำถาม เซิร์ฟเวอร์ของคุณอาจตีความแตกต่างกัน แต่anecdotallyคุณสามารถดูบางภาษาการรักษาที่เป็นค่าบูลีนซึ่งเป็นจริงถ้าจดทะเบียน


6
สำหรับคำจำกัดความอย่างเป็นทางการโปรดดู RFC 2396 ( ietf.org/rfc/rfc2396.txt ) ซึ่งไม่มีการโต้ตอบกับเนื้อหาของสตริงการสืบค้นนอกเหนือจากการระบุชุดอักขระตามกฎหมายและชุดอักขระที่มีความหมายพิเศษ โดยเฉพาะอย่างยิ่งกล่าวว่า "องค์ประกอบการสืบค้นเป็นสตริงของข้อมูลที่จะตีความโดยทรัพยากร" ซึ่งหมายความว่าคำจำกัดความนั้นขึ้นอยู่กับโปรโตคอลดังนั้นคีย์ = ค่าส่วนใหญ่จึงเป็นไปตามแบบแผน
RobertB

8

ใช่มันถูกต้อง

หากต้องการตรวจสอบว่ามีพารามิเตอร์อยู่หรือไม่นี่เป็นวิธีหนึ่งที่ทำได้


4

ข้อมูลจำเพาะ URI

ส่วนที่เกี่ยวข้องเพียงอย่างเดียวของข้อมูลจำเพาะ URI คือการรู้ทุกอย่างระหว่างส่วนแรก?และส่วนแรก#เหมาะกับคำจำกัดความของคำค้นหา สามารถรวมอักขระใด ๆ เช่น[:/.?]. ซึ่งหมายความว่าสตริงการสืบค้นเช่น?barหรือ?ten+green+applesถูกต้อง

ค้นหาRFC 3986 ที่นี่

ข้อมูลจำเพาะ HTML

isindex ไม่ใช่ HTML5 อย่างมีความหมาย

มีให้เลิกใช้งานเพื่อใช้เป็นองค์ประกอบแรกในรูปแบบเท่านั้นและส่งโดยไม่มีชื่อ

หากชื่อของรายการคือ "isindex" ประเภทของรายการจะเป็น "ข้อความ" และนี่คือรายการแรกในชุดข้อมูลแบบฟอร์มจากนั้นต่อท้ายค่าเพื่อผลลัพธ์และข้ามขั้นตอนย่อยที่เหลือสำหรับรายการนี้ไปยังรายการถัดไป รายการถ้ามีหรือขั้นตอนถัดไปในอัลกอริทึมโดยรวมเป็นอย่างอื่น

แฟล็ก isindex มีไว้สำหรับการใช้งานแบบเดิมเท่านั้น แบบฟอร์มที่สอดคล้องกับเอกสาร HTML จะไม่สร้างเพย์โหลดที่ต้องถอดรหัสด้วยชุดแฟล็กนี้

ครั้งสุดท้ายที่isindex ได้รับการสนับสนุนเป็น HTML3 ใช้ใน HTML5 เพื่อให้เข้ากันได้ง่ายขึ้น

สนับสนุนในห้องสมุด

การสนับสนุนในไลบรารีสำหรับรูปแบบของ URI นี้จะแตกต่างกันไปอย่างไรก็ตามบางไลบรารีให้การสนับสนุนแบบดั้งเดิมเพื่อให้ใช้งานง่ายisindexขึ้น

Perl URI.pm (การสนับสนุนพิเศษ)

ไลบรารีบางแห่งเช่นURI ของ Perlมีวิธีการแยกวิเคราะห์โครงสร้างประเภทนี้

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(ไม่มีการสนับสนุนพิเศษ)

ในอีกตัวอย่างหนึ่งที่node.jsใช้บ่อยกว่าให้ใช้เส้นทางปกติและลดการแยกวิเคราะห์เป็นอย่างใดอย่างหนึ่ง

  • สตริง
  • หรือวัตถุของคีย์และค่า (ใช้parseQueryString)

API การแยกวิเคราะห์ URI อื่น ๆ ส่วนใหญ่ตามสิ่งที่คล้ายกันนี้



3

isindexเลิกใช้เวทมนตร์nameจาก HTML5

คุณลักษณะที่เลิกใช้แล้วนี้อนุญาตให้ส่งแบบฟอร์มเพื่อสร้าง URL ดังกล่าวโดยให้หลักฐานเพิ่มเติมว่าใช้ได้กับ HTML เช่น:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

สร้าง URL ประเภท:

?bar

มาตรฐาน: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindexอย่างไรก็ตามเลิกใช้แล้วตามที่ระบุไว้ที่: https://stackoverflow.com/a/41689431/895245


1

ตามคำตอบอื่น ๆ ทั้งหมดที่อธิบายไว้ใช้ได้อย่างสมบูรณ์สำหรับการตรวจสอบโดยเฉพาะสำหรับสิ่งที่เป็นบูลีน

นี่คือฟังก์ชันง่ายๆในการรับสตริงการสืบค้นตามชื่อ:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

และตอนนี้คุณต้องการตรวจสอบว่าสตริงข้อความค้นหาที่คุณต้องการมีอยู่หรือไม่คุณอาจทำสิ่งง่ายๆเช่น:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

exampleQueryStringจะเป็นถ้าฟังก์ชั่นไม่สามารถหาสตริงแบบสอบถามมิฉะนั้นจะเป็นfalsetrue

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.