💻 Paremklõpsuga kopeerimise ja kleepimise parandamine Windows 10 Home'is ei tööta - väga lihtne

Mida tähendavad URL-is sageli leitud topeltkriipsud?

Näiteks:

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

Pange tähele, et ma ei pea silmas kohe algust http:.

See on viga programmeerijate / arendajate koodis. Kui võrrelda neid kahte URL-i:

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

Nad näevad välja erinevad, kuid kui külastaksite mõnda, töötaksid mõlemad enamikus kaasaegsetes brauserites.

See on midagi, mida soovite parandada. Kui teil on topeltkriips, võib see Google'i veebirobotid segadusse ajada ja panna nad arvama, et lehel on kaks versiooni.

  • 11 Tegelikult pole lehe laadimisel midagi pistmist brauser, vaid pigem server ignoreerib täiendavat kaldkriipsu. See läks pikaks, nii et vaadake minu postitatud vastust.

Nagu @RandomBen mainis, on topeltkriips tõenäoliselt kusagil vea tagajärg.

Selle lehe laadimisel pole pistmist brauser, vaid pigem server ignoreerib täiendavat kaldkriipsu. Brauser ei tee URL-is täiendavate kaldkriipsudega midagi erilist, vaid saadab need lihtsalt päringusse:

GET /A/B//C/D HTTP/1.1 Host: www.example.com ... 

Tundub, et nii Apache'i kui ka IIS-i praegused versioonid ignoreerivad tee lahendamisel täiendavaid kaldkriipse ja tagastavad dokumendi, mis oleks tagastatud, kui URL-il poleks täiendavaid kaldkriipse. Kuid, brauserid (testisin IE 8 ja Chrome 9) lähevad segadusse lehe ressursside mis tahes suhtelise URL-iga (mis sisaldab vanema tee komponente), mis annab halbu tulemusi. Näiteks kui lehel on:

<link rel='stylesheet' href='../../style.css' type='text/css' /> 

Lehe laadimisel /a/b/c/, taotleb brauser /a/style.css. Aga kui - mingil põhjusel -/a/b//c/ taotletakse (ja server ignoreerib täiendavat kaldkriipsu), brauser lõpuks taotleb /a/b/style.css, mida pole olemas. Vabandust, leht näeb kole välja.

(Seda ilmselgelt ei juhtu, kui URL-il pole vanema tee komponenti (..) või on absoluutne.)

Minu arvates tegutsevad Apache ja IIS (ja ilmselt ka teised) valesti as /a/b/c/ ja /a/b//c/ esindavad tehniliselt kahte erinevat ressurssi. Vastavalt RFC 2396-le on iga kaldkriips märkimisväärne:

 path = [ abs_path | opaque_part ] path_segments = segment *( '/' segment ) segment = *pchar *( ';' param ) param = *pchar pchar = unreserved | escaped | ':' | '@' | '&' | '=' | '+' | '$' | ',' 

Niisiis, /a/b/c/ koosneb kolmest segmendist: "a", "b" ja "c"; /a/b//c/ koosneb tegelikult neljast: "a", "b", "" (tühi string) ja "c". See, kas tühi string on kehtiv failisüsteemi kataloog, on serveri platvormi detail. (Ja loogiliselt võttes tähendab see, et brauserid tegelikult töötavad õigesti kui parsitakse suhtelisi URL-e vanema tee komponentidega - minu näites lähevad need mööda kataloogi "c" ja kataloogi "", jättes meid taotlema style.css "b" -st.)

Kui kasutate Apache'i mod_rewrite, on üsna lihtne lahendus:

# remove multiple slashes anywhere in url RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R=301,L] 

See väljastab HTTP 301 Moved Permanently ümbersuunamine nii, et topeltkriipsud eemaldatakse URL-ist.

  • 2 Kas poleks parem oma mod_rewrite lahuses arvestada ka 3, 4, ... kaldkriipsudega? Midagi sarnast /{2,}? (Eeldades, et Apache lubab sellist kvantorit, ma pole sellega liiga tuttav)
  • +1 - aitäh lisateabe eest. Ma ei mõelnud sellest niimoodi!
  • 3 Ei ole vale käitumine: a/b ja a//b on tõepoolest kaks erinevat URL-i teed, kuid miski ei keela serveril soovi korral mõlemale sama ressurssi tagastada. Olen siiski teiega nõus, et praktikas tunduks 301 ümbersuunamise tagastamine kasulikum.
  • 4 @IlmariKaronen: See on absoluutselt on vale käitumine, kuna (1) see käitumine automaatselt loob lõpmatu hulga võimalikke duplikaatviiteid ühele ressursile (mis rikub kindlasti vaimu, kui see pole vastuolus ühegi spetsifikatsiooni tähega) ja praktiliselt (2) "lõhub" suhtelise tee käitlemise brauserites, mis seda teevad korralikult loe tühi string sisse a//b kataloogina (vt ülaltoodud stiililehe näidet).
  • 1 ... ja igatahes väidaksin ma, et RFC 2396 teeb keelake serveril sama ressursi tagastamine kaldkriipsude automaatse varisemisega, sest spetsifikatsiooni kohaselt on iga kaldkriips märkimisväärne. Järjestikuste kaldkriipsude automaatne ignoreerimine on vastuolus selle spetsifikatsiooniga. (See on üks asi, kui keegi programmeeris oma serveri seda tegema, isegi kui see oleks rumal. Kuid serverid, kes seda vaikimisi teevad on vale.)

Topeltkaldkriipsul on tähendus, kui seda kasutatakse ressursi URL-ides. Näiteks kui see on taustpildi URL-i kasutaja CSS-is:

.classname { background : url('//example.com/a/b/c/d.png'); } 

Siin tähendab see, et seda taustpilti tõmmatakse muust kui praeguse veebilehe domeenist. Või teisisõnu http:// saab kirjutada õiglasena // kui kasutate seda ressursi URL-ides.

Kuid see topeltkriips URL-ide vahel (nt: /a//b/c/d.htm) pole mingit tähendust.

  • 1 noh, see pole täielik tõde. Kahekordne kaldkriips on märgitud, kui tuleb vältida segasisese probleemi tekkimist, seega kui sait laaditakse http-ist, laieneb topeltkriips ka http-iks, kui saiti laaditakse https-ist, laiendatakse topeltkriips ka https-iks.

Nagu mainitud, on mõned serverid seadistatud ignoreerima URL-i topeltkaldkriipsu, kuid Amazon S3 staatiline hostimine mitte. Kui soovite sellisel juhul neid käsitseda / ignoreerida, saate atribuutide paneelil kasutada ümbersuunamisreegleid.

Kui soovite eirata topeltkriipsu, mis järgneb domeeninimele, võite kasutada midagi sellist:

   /       

Tõenäoliselt saate neid ka kogu ulatuses leida ja asendada, kuid mulle piisas sellest.

none: Charles Robertson | none

none