내 샘플 URL이
그리고 나는 다음과 같은 경로가 있다고 말합니다.
app.get('/one/two', function (req, res) {
var url = req.url;
}
의 값은 url
입니다 /one/two
.
Express 에서 전체 URL 을 얻으려면 어떻게해야 합니까? 예를 들어 위의 경우을 받고 싶습니다 http://example.com/one/two
.
내 샘플 URL이
그리고 나는 다음과 같은 경로가 있다고 말합니다.
app.get('/one/two', function (req, res) {
var url = req.url;
}
의 값은 url
입니다 /one/two
.
Express 에서 전체 URL 을 얻으려면 어떻게해야 합니까? 예를 들어 위의 경우을 받고 싶습니다 http://example.com/one/two
.
답변:
프로토콜은로 제공됩니다 req.protocol
. 여기에 문서
http
아니라고 가정 할 수 있습니다 .이 경우 프로토콜임을 알고 있습니다req.get('X-Forwarded-Protocol')
https
req.get('host')
Gopal이 지시 한대로 주최자
URL에 비표준 포트가 필요하지는 않지만 app.listen
서버 시작시 전달한 것이기 때문에 포트를 알아야 할 경우 응용 프로그램 상태에있게 됩니다. 그러나 비표준 포트 지역 개발의 경우, 크롬 때문에 호스트 헤더의 포트를 포함하는 것 같다 req.get('host')
수익을 localhost:3000
예를 들어. 따라서 적어도 표준 포트의 프로덕션 사이트의 경우 (프록시 프록시없이) Express 앱을 직접 탐색하는 경우 host
헤더는 URL의 포트와 관련하여 올바른 일을하는 것 같습니다.
경로는 req.originalUrl
(@pgrassant 덕분에) 나온 것입니다. 이 DOES에는 쿼리 문자열이 포함되어 있습니다. req.url 및 req.originalUrl에 대한 문서는 여기입니다 . URL로 수행하려는 작업에 따라에 originalUrl
비해 올바른 값일 수도 있고 아닐 수도 있습니다 req.url
.
이들을 모두 결합하여 절대 URL을 재구성하십시오.
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
req.get('Host')
대신 req.host
호스트와 포트 섹션을 제공하는 대신 사용 하십시오.
host
요청 헤더 의 매개 변수는 스푸핑 될 수 있습니다. res.host
이 방법을 사용하면 "호스트 헤더 공격"이 발생할 수 있습니다. Django 프레임 워크에는 이러한 공격을 방지하는 데 사용되는 '허용 된 호스트'변수가 있습니다. 완료를 위해 root_url
추가 할 수 있는 구성 변수를 사용합니다 req.url
. : 공격에 대해 skeletonscribe.net/2013/05/...
req.originalUrl
매개 변수없이 추가하려면 간단히 수행하십시오 req.originalUrl.split("?").shift()
. 출처 : stackoverflow.com/a/32118818/2037431
사물을 직접 연결하는 대신 URL에 node.js API를 사용 하고URL.format()
express의 정보를 전달할 수 있습니다.
예:
var url = require('url');
function fullUrl(req) {
return url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl
});
}
req.get('host')
만 반환합니다 . 이유를 모르지만 이제는 설정에서 포트 번호를 수집하고 대신 필드를 사용합니다 . hostname
host
pathname
나는 당신이 의미하는 것 같아요 path
. 검색 / 쿼리 문자열 포함
요청한 URL을 얻는 것이 약간의 PITA라는 것을 알았습니다. 나는 표현이 더 쉬운 방법이 없다고 믿을 수 없다. req.requested_url이어야합니다.
그러나 내가 어떻게 설정했는지는 다음과 같습니다.
var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.host + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
req.port
존재 하는가? Express 설명서에 없습니까?
req.app.settings.port
url.format 사용 :
var url = require('url');
이것은 모든 프로토콜을 지원하며 포트 번호를 포함합니다. originalUrl에 쿼리 문자열이 없으면 다음과 같은 클리너 솔루션을 사용할 수 있습니다.
var requrl = url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl,
});
쿼리 문자열이있는 경우 :
var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.host = req.get('host');
var requrl = url.format(urlobj);
다음은 URL을 얻기 위해 req 객체를 호출 할 수있는 함수를 추가하는 좋은 방법입니다
app.use(function(req, res, next) {
req.getUrl = function() {
return req.protocol + "://" + req.get('host') + req.originalUrl;
}
return next();
});
이제 필요할 때 필요할 때 호출 할 수있는 기능이 있습니다.
프록시 뒤에 Express가 있을 때 req.host/req.hostname을 유효하게하려면 두 가지 조건이 있어야합니다 .
app.set('trust proxy', 'loopback');
app.js에서X-Forwarded-Host
웹 서버에서 자신이 헤더를 지정해야합니다. 예. 아파치, nginxnginx :
server {
listen myhost:80;
server_name myhost;
location / {
root /path/to/myapp/public;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://myapp:8080;
}
}
아파치 :
<VirtualHost myhost:80>
ServerName myhost
DocumentRoot /path/to/myapp/public
ProxyPass / http://myapp:8080/
ProxyPassReverse / http://myapp:8080/
</VirtualHost>
127.0.0.1
req.get('host')
를 사용하여 구성해야합니다 req.headers.host + req.url
. 물론 다른 포트에서 호스팅하고 있다면 아이디어를 얻습니다. ;-)
req.protocol
URL 대신 originalUrl을 사용하는 것이 좋습니다.
var url = req.protocol + '://' + req.get('host') + req.originalUrl;
여기에서 originalUrl에 대한 설명을 참조하십시오. http://expressjs.com/api.html#req.originalUrl
우리 시스템에서 우리는 이와 같은 일을하므로 originalUrl은 우리에게 중요합니다
foo = express();
express().use('/foo', foo);
foo.use(require('/foo/blah_controller'));
blah_controller는 다음과 같습니다 :
controller = express();
module.exports = controller;
controller.get('/bar/:barparam', function(req, res) { /* handler code */ });
따라서 URL의 형식은 다음과 같습니다.
www.example.com/foo/bar/:barparam
따라서 bar 컨트롤러 get 처리기에 req.originalUrl이 필요합니다.
노드 패키지 'url'(npm install url)을 사용합니다.
전화 할 때하는 일은
url.parse(req.url, true, true)
URL의 일부 또는 전부를 검색 할 수 있습니다. 자세한 정보는 여기 : https://github.com/defunctzombie/node-url
http://www.example.com/ 에서 / 뒤에 오는 것을 변수로 사용하고 특정 프로파일 (Facebook과 같은 종류 : http : //www.facebook) 을 가져 오기 위해 다음과 같은 방법으로 사용했습니다 . com / username )
var url = require('url');
var urlParts = url.parse(req.url, true, true);
var pathname = urlParts.pathname;
var username = pathname.slice(1);
이것이 작동하려면 server.js 파일에서 다음과 같이 경로를 만들어야합니다.
self.routes['/:username'] = require('./routes/users');
그리고 경로 파일을 다음과 같이 설정하십시오 :
router.get('/:username', function(req, res) {
//here comes the url parsing code
}
이 경로에서이 기능을 사용할 수 있습니다
app.get('/one/two', function (req, res) {
const url = getFullUrl(req);
}
/**
* Gets the self full URL from the request
*
* @param {object} req Request
* @returns {string} URL
*/
const getFullUrl = (req) => `${req.protocol}://${req.headers.host}${req.originalUrl}`;
req.protocol
http 또는 https
를 제공하고 req.headers.host
www.google.com과 같은 전체 호스트 이름
req.originalUrl
을 제공하고 나머지는 제공합니다 pathName
(귀하의 경우 /one/two
)