URL 매개 변수를 인코딩하는 방법은 무엇입니까?


123

다음과 같은 URL에 매개 변수를 전달하려고합니다.

http://www.foobar.com/foo?imageurl=

그리고 다른 API에 의해 자체적으로 생성 된 이미지 URL과 같은 매개 변수를 전달하고 싶습니다. 이미지에 대한 링크는 다음과 같습니다.

http://www.image.com/?username=unknown&password=unknown

그러나 URL을 사용하려고 할 때 :

http://www.foobar.com/foo?imageurl=http://www.image.com/?username=unknown&password=unknown

작동하지 않습니다.

나는 또한 사용 encodeURI()하고 encodeURIComponent()imageURL에서 시도했지만 그것도 작동하지 않습니다.


URL을 생성하는 언어는 무엇입니까? 자바 스크립트?
Phil

2
클라이언트와 서버 사이의 모든 라우터는 전체 URL을 볼 수 있으므로 https를 사용할 때도 URL에 비밀번호를 입력해서는 안됩니다.
fabb

답변:


171

PHP 사용

echo urlencode("http://www.image.com/?username=unknown&password=unknown");

결과

http%3A%2F%2Fwww.image.com%2F%3Fusername%3Dunknown%26password%3Dunknown

자바 스크립트 사용 :

var myUrl = "http://www.image.com/?username=unknown&password=unknown";
var encodedURL= "http://www.foobar.com/foo?imageurl=" + encodeURIComponent(myUrl);

데모 : http://jsfiddle.net/Lpv53/


37

새로운 ES6을 사용하면 Object.entries()약간의 중첩 된 map/ join:

const encodeGetParams = p => 
  Object.entries(p).map(kv => kv.map(encodeURIComponent).join("=")).join("&");

const params = {
  user: "María Rodríguez",
  awesome: true,
  awesomeness: 64,
  "ZOMG+&=*(": "*^%*GMOZ"
};

console.log("https://example.com/endpoint?" + encodeGetParams(params))


1

encodeURIComponent()또는을 사용해서는 안됩니다 encodeURI(). MDN 문서에 따라 fixedEncodeURIComponent()및을 사용해야합니다 fixedEncodeURI().

에 관하여 encodeURI()...

URL에 대한 최신 RFC3986을 따르고 자하는 경우 (IPv6의 경우) 대괄호가 예약되어 URL (예 : 호스트)의 일부가 될 수있는 항목을 구성 할 때 인코딩되지 않는 경우 다음 코드 조각이 도움이 될 수 있습니다.

function fixedEncodeURI(str) { return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']'); }

에 관하여 encodeURIComponent()...

RFC 3986 (!, ', (,) 및 * 예약)을 더 엄격하게 준수하려면 이러한 문자에 형식화 된 URI 구분 용도가 없더라도 다음을 안전하게 사용할 수 있습니다.

function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }

그렇다면 차이점은 무엇입니까? fixedEncodeURI()fixedEncodeURIComponent()동일한 값 세트를 변환하지만, fixedEncodeURIComponent()이 세트를 변환합니다 +@?=:*#;,$&. 이 세트는 GET매개 변수 ( &, +등), 앵커 태그 ( #), 와일드 카드 태그 ( *), 이메일 / 사용자 이름 부분 ( @) 등에 사용됩니다.

예를 들어 - 당신이 사용하는 경우 encodeURI(), user@example.com/?email=me@home제대로 초를 전송하지 않습니다 @(크롬 자연스럽게 종종처럼) 호환성을 처리 브라우저를 제외하고, 서버에.


무슨 뜻 "except for your browser handling the compatibility"입니까?
Stephan

@Stephan : 예를 들어 site.com?formula=a+b=c를 생산하는 경우 formula=>a+b=c사양에 위배되지만 작동하는 경우 Chrome 등 때문입니다. URL 등의 사양 실패를 감지 할 수 있습니다 user@site.com?email=user@site.com.
HoldOffHunger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.