Programming

Express에서 전체 URL을 얻는 방법?

procodes 2020. 2. 18. 22:55
반응형

Express에서 전체 URL을 얻는 방법?


내 샘플 URL이

http://example.com/one/two

그리고 나는 다음과 같은 경로가 있다고 말합니다.

app.get('/one/two', function (req, res) {
    var url = req.url;
}

의 값은 url입니다 /one/two.

Express 에서 전체 URL얻으려면 어떻게해야 합니까? 예를 들어 위의 경우을 받고 싶습니다 http://example.com/one/two.


  1. 프로토콜은로 제공됩니다 req.protocol. 여기에 문서

    1. express 3.0 이전에는 프로토콜 이 설정되어 있고 값 이없는 경우 http아니라고 가정 할 수 있습니다 .이 경우 프로토콜임을 알고 있습니다req.get('X-Forwarded-Protocol')https
  2. req.get('host')Gopal이 지시 한대로 주최자

  3. URL에 비표준 포트가 필요하지는 않지만 app.listen서버 시작시 전달한 것이기 때문에 포트를 알아야 할 경우 응용 프로그램 상태에있게 됩니다. 그러나 비표준 포트 지역 개발의 경우, 크롬 때문에 호스트 헤더의 포트를 포함하는 것 같다 req.get('host')수익을 localhost:3000예를 들어. 따라서 적어도 표준 포트의 프로덕션 사이트의 경우 Express 프록시를 사용하지 않고 Express 앱을 직접 탐색하는 경우 host헤더는 URL의 포트와 관련하여 올바른 일을하는 것으로 보입니다.

  4. 경로는 req.originalUrl(@pgrassant 덕분에) 나온 것입니다. 이 DOES에는 쿼리 문자열이 포함되어 있습니다. req.url 및 req.originalUrl에 대한 문서는 여기입니다 . URL로 수행하려는 작업에 따라에 originalUrl비해 올바른 값일 수도 있고 아닐 수도 있습니다 req.url.

이들을 모두 결합하여 절대 URL을 재구성하십시오.

  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;

사물을 직접 연결하는 대신 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
  });
}

요청한 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;

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을 유효하게하려면 두 가지 조건이 있어야합니다 .

  1. app.set('trust proxy', 'loopback'); app.js에서
  2. X-Forwarded-Host웹 서버에서 사용자가 헤더를 지정해야합니다. 예. 아파치, nginx

nginx :

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>

이것을 사용하십시오.

var url = req.headers.host + '/' + req.url;

을 사용하여 구성해야합니다 req.headers.host + req.url. 물론 다른 포트에서 호스팅하고 있다면 아이디어를 얻습니다. ;-)


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이 필요합니다.


내 코드는 다음과 같습니다

params['host_url'] = req.protocol + '://' + req.headers.host + req.url;


var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;

또는

var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;

노드 패키지 '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
}

실제로 아래 코드를 사용하면 URL을 얻을 수 있음을 발견했습니다. 그런 다음 그것을 슬라이스하고 다음을 결정하십시오.

app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
  });

이 정보에 감사드립니다. 이것은 매우 성가신 일입니다.

이것을 코드에 추가하면 다시 생각할 필요가 없습니다.

var app = express();

app.all("*", function (req, res, next) {  // runs on ALL requests
    req.fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl
        next()
})

콘솔에 로그와 같은 다른 작업도 수행하거나 설정할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/10183291/how-to-get-the-full-url-in-express



반응형