এক্সপ্রেসে কীভাবে পুরো ইউআরএল পাবেন?


486

আমার নমুনা ইউআরএল বলা যাক

http://example.com/one/two

এবং আমি বলি যে আমার নীচের রুট রয়েছে

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

মান urlহবে /one/two

এক্সপ্রেসে আমি কীভাবে পুরো ইউআরএল পাব ? উদাহরণস্বরূপ, উপরের ক্ষেত্রে, আমি গ্রহণ করতে চাই http://example.com/one/two


6
এফওয়াইআই আপনি অনুরোধের বিষয়টিটি পরীক্ষা করতে পারেন এবং এটি সন্ধান করতে পারেন তবে আমি মুনাফিক এবং এটি এখানে পেয়েছি।
জেসন সেব্রিং

উত্তর:


742
  1. প্রোটোকল হিসাবে উপলব্ধ req.protocolডক্স এখানে

    1. এক্সপ্রেস 3.0.০ এর আগে, প্রোটোকলটি আপনি ধরে নিতে পারবেন httpযদি না আপনি req.get('X-Forwarded-Protocol')সেট সেট হয়ে থাকেন এবং তার মান না থাকে তবে আপনি httpsযদি জানেন যে এটি আপনার প্রোটোকল
  2. req.get('host')গোপাল যেমন ইঙ্গিত করেছেন তেমনই হোস্ট আসে

  3. আশা করি আপনার ইউআরএলগুলিতে আপনাকে কোনও অ-মানক বন্দর লাগবে না, তবে আপনার যদি এটির প্রয়োজনের দরকার হয় তবে এটি আপনার অ্যাপ্লিকেশন অবস্থায় থাকতে হবে কারণ এটি app.listenসার্ভার প্রারম্ভকালে আপনি যা যা করেছেন তা । যাইহোক, একটি অ-মানক পোর্টে স্থানীয় বিকাশের ক্ষেত্রে, ক্রোম হোস্ট শিরোনামে বন্দরটি অন্তর্ভুক্ত করে বলে মনে হয় সুতরাং উদাহরণস্বরূপ req.get('host')returns localhost:3000সুতরাং অন্তত কোনও স্ট্যান্ডার্ড পোর্টে কোনও প্রোডাকশন সাইটের ক্ষেত্রে এবং সরাসরি আপনার এক্সপ্রেস অ্যাপ্লিকেশনটিতে (বিপরীত প্রক্সি ছাড়াই) ব্রাউজ করার ক্ষেত্রে, hostশিরোনামটি ইউআরএলে পোর্ট সম্পর্কিত সঠিক কাজটি করেছে বলে মনে হচ্ছে।

  4. পথটি এসেছে req.originalUrl(ধন্যবাদ @ পেগ্রাস্যান্ট) থেকে। নোট করুন এতে কিউরি স্ট্রিং অন্তর্ভুক্ত রয়েছে। এখানে ডকুমেন্টগুলি req.url এবং req.originalUrl এ । আপনি ইউআরএল নিয়ে কী করতে চান তার উপর নির্ভর করে originalUrlতুলনার তুলনায় সঠিক মান হতে পারে বা নাও হতে পারে req.url

পরম ইউআরএল পুনর্গঠন করতে তাদের সবাইকে একত্রিত করুন।

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

3
@ ডেভ একটি ক্লায়েন্ট যা যা শিরোনাম চায় তা প্রেরণ করতে পারে (পাশাপাশি যে কোনও ইউআরএল, পোর্ট, এলোমেলো নন-এইচটিটিপি আবর্জনা) যাইহোক, কিছু সময় বোগাস বা ভুল শিরোনাম কেবল প্রোটোকলকে ব্যর্থ করে দেবে। উদাহরণস্বরূপ, ভার্চুয়াল হোস্ট পরিবেশে, একটি ভুল "হোস্ট" শিরোনাম সম্পূর্ণ আলাদা একটি ওয়েব সাইট প্রদর্শন করবে। এক্স-ফরওয়ার্ড-প্রোটোকলের ক্ষেত্রে, এটি সাধারণত প্রকৃত ক্লায়েন্ট (ব্রাউজার) দ্বারা পাঠানো হয় না তবে বিপরীত প্রক্সি (এনজিনেক্স / বার্নিশ / অ্যাপাচি / যাই হোক না কেন) যা আপনার আবেদনের সামনে এইচটিটিপিএস সরবরাহ করে থাকে।
পিটার লিয়নস

59
বা এর req.get('Host')পরিবর্তে ব্যবহার করুন req.hostযা হোস্টকে প্লাস পোর্ট বিভাগ দেয়।
ডায়োসনি

1
সম্ভবত এটির জন্য আলাদা প্রশ্ন পোস্ট করা ভাল। এই প্রশ্নটি এক্সপ্রেস সম্পর্কে।
পিটার লিয়নস

18
hostঅনুরোধ হেডার মাপদণ্ড প্রতারণামূলক করা যেতে পারে। যদি res.hostএইভাবে ব্যবহার করা হয় তবে একটি সম্ভাব্য "হোস্ট শিরোলেখ আক্রমণ" রয়েছে । জাজানো ফ্রেমওয়ার্কে তাদের একটি 'অনুমোদিত অনুমতিপ্রাপ্ত হোস্ট' ভেরিয়েবল রয়েছে যা এই জাতীয় আক্রমণ প্রতিরোধ করতে ব্যবহৃত হয়। আমি একটি কনফিগারেশন ভেরিয়েবল ব্যবহার করি root_urlযা আমার যা সম্পূর্ণ হওয়ার জন্য যুক্ত হতে পারে req.url। আক্রমণ সম্পর্কে: skeletonscribe.net/2013/05/…
আমির এল্ডার

1
আপনি যদি req.originalUrlপরামিতি ছাড়াই যুক্ত করতে চান তবে কেবল করুন req.originalUrl.split("?").shift()। সূত্র: স্ট্যাকওভারফ্লো.com
মার্কোস পেরেইরা

131

আপনার নিজেরাই জিনিসগুলিকে একত্রে যুক্ত করার পরিবর্তে আপনি ইউআরএলগুলির জন্য নোড.জেএসআইপি ব্যবহার করতে পারেন এবং URL.format()এক্সপ্রেস থেকে তথ্যগুলি পাস করতে পারেন।

উদাহরণ:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    host: req.get('host'),
    pathname: req.originalUrl
  });
}

4
আমার ক্ষেত্রে বন্দরটি নয়, req.get('host')কেবল হোস্টনাম অংশটি ফেরত দেয়। কেন জানি না, তবে এখন আমি সেটিংস থেকে পোর্ট নম্বর সংগ্রহ করি এবং এর hostnameপরিবর্তে ক্ষেত্রটি ব্যবহার করি host
ম্যাক্সকুরিউকভ

1
পরিবর্তে pathname, আমি আপনাকে বোঝাতে চাইছি path। যার মধ্যে অনুসন্ধান / ক্যোরিস্ট্রিং অন্তর্ভুক্ত রয়েছে
সানজ

3
এটি ইউআরএলগুলির জন্য কাজ করে না যার কাছে ক্যোরি স্ট্রিং রয়েছে।
কিথ

37

অনুরোধ করা ইউআরএল পেতে আমি পিটাকে কিছুটা খুঁজে পেয়েছি। আমি বিশ্বাস করতে পারি না এক্সপ্রেসের সহজ উপায় নেই। শুধু req.requmitted_url হওয়া উচিত

তবে আমি এটি কীভাবে সেট করেছি তা এখানে:

var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;

পোর্ট ভেরিয়েবল সংজ্ঞায়িত করতে হবে?
আমল এম কুলকার্নি

4
না req.portরয়েছে? এটি এক্সপ্রেস ডকুমেন্টেশনে না?
মিতার

আমার খারাপ। আমি ধরে নিয়েছি আপনি জানেন যে আপনি কোন বন্দরটি পরিবেশন করছেন এবং এটি পূর্ব নির্ধারণ করেছেন। আমি আবার উদাহরণ আপডেট করব। আপনি এটি দিয়ে পেতে পারেনreq.app.settings.port
chovy

যখন রেকর্ড.প্রোটোকল খালি থাকে, এর অর্থ কি এইচপি?
কোডবিট

এইটি ক্যোয়ারী সহ নয়। এটি সম্পূর্ণ হয় না। গৃহীত উত্তর আরও ভাল।
Kostanos

17

Url.format ব্যবহার :

var url = require('url');

এটি সমস্ত প্রোটোকল সমর্থন করে এবং পোর্ট নম্বর অন্তর্ভুক্ত করে। যদি আপনার অরিজিনাল ইউআরএলটিতে কোয়েরি স্ট্রিং না থাকে আপনি এই ক্লিনার সমাধানটি ব্যবহার করতে পারেন:

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);

16

এখানে একটি ফাংশন যুক্ত করার একটি দুর্দান্ত উপায় আপনি ইউআরএল পেতে রেকর্ড অবজেক্টে কল করতে পারেন

  app.use(function(req, res, next) {
    req.getUrl = function() {
      return req.protocol + "://" + req.get('host') + req.originalUrl;
    }
    return next();
  });

এখন আপনার একটি ক্রিয়াকলাপ রয়েছে আপনার প্রয়োজনের প্রয়োজনে কল করতে পারেন।


2
এটিতে ব্যবহারকারীর অন্তর্ভুক্ত নেই: পাসওয়ার্ড যা আপনি একটি সম্পূর্ণ ইউআরএল'র ব্যবহারকারী: Pass@host.com: 8080 / p / a / t / h? ক্যোরি = স্ট্রিং # হ্যাশ '
কোড স্বতন্ত্র

@ কোড ইউনিকুইলি সত্য, তবে যেহেতু সেই সম্মেলনটি এখন এক দশকেরও বেশি সময় ধরে অবহেলিত হয়েছে, আশা করি কেউই তাদের এআইপিগুলিতে আসলেই ইউজার ইনফোর চশমা তৈরি করছে না
মাইক

11

প্রক্সিগুলির পিছনে এক্সপ্রেস কার্যকর করতে req.host/req.hostname কার্যকর করার দুটি শর্ত থাকতে হবে :

  1. app.set('trust proxy', 'loopback'); app.js এ
  2. X-Forwarded-Hostহেডার অবশ্যই ওয়েবসারভারে আপনার নিজের দ্বারা নির্দিষ্ট করা উচিত। যেমন। অ্যাপাচি, এনগিনেক্স

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>


1
হাঁ, কেউ কিছু বলা, যদি আপনি Apache বা nginx কোন সঠিক কনফিগারেশন আছে, তবে আপনি পাবেন 127.0.0.1থেকেreq.get('host')
Spark.Bao


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

অথবা

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

6

আপনি এটি ব্যবহার করে নির্মাণ করা প্রয়োজন req.headers.host + req.url। অবশ্যই আপনি যদি অন্য কোনও বন্দরে হোস্টিং করছেন এবং যেমন আপনি ধারণাটি পান ;-)


1
এটি আমার কাছে প্রোটোকল ছাড়াও সবকিছু পেয়েছে ... এমন কিছু আছে যা আমাকে বলতে পারে?
ক্রিস আব্রামস

প্রোটোকল ব্যবহার পেতে:req.protocol
mrded

6

আমি URL এর পরিবর্তে অরিজিনাল ইউআরএল ব্যবহার করার পরামর্শ দেব:

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

আসল ইউআরএলটির বর্ণনা এখানে দেখুন: http://expressjs.com/api.html#req.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 */ });

সুতরাং আমাদের ইউআরএলগুলির ফর্ম্যাটটি রয়েছে:

www.example.com/foo/bar/:barparam

সুতরাং, বার নিয়ামক হ্যান্ডলার পেতে আমাদের rek.originalUll প্রয়োজন।


6

আমার কোডটি এর মতো দেখাচ্ছে,

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


5

আমি নোড প্যাকেজ 'ইউআরএল' ব্যবহার করি (এনপিএম ইনস্টল url)

আপনি যখন কল করবেন তখন এটি যা করে

url.parse(req.url, true, true)

এটি আপনাকে url এর সমস্ত বা অংশ পুনরুদ্ধার করার সম্ভাবনা দেয় give এখানে আরও তথ্য: https://github.com/defunctzombie/node-url

ভেরিয়েবল হিসাবে ব্যবহার করতে এবং একটি নির্দিষ্ট প্রোফাইল (যেমন ফেসবুকের মতো: HTTP: //www.facebook) টানতে / ইন http://www.example.com/ এর পরে যা কিছু আসে তা পেতে আমি নিম্নলিখিত পদ্ধতিতে এটি ব্যবহার করেছি । কম / ব্যবহারকারীর নাম )

    var url = require('url');
    var urlParts = url.parse(req.url, true, true);
    var pathname = urlParts.pathname;
    var username = pathname.slice(1);

এটি কাজ করার জন্য আপনাকে নিজের সার্ভার.জেএস ফাইলটিতে এইভাবে আপনার রুট তৈরি করতে হবে:

self.routes['/:username'] = require('./routes/users');

এবং আপনার রুট ফাইলটি এইভাবে সেট করুন:

router.get('/:username', function(req, res) {
 //here comes the url parsing code
}

2

আপনি রুটটিতে এই ফাংশনটি ব্যবহার করতে পারেন

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.hostwww.google.com এর মতো পুরো হোস্ট নাম req.originalUrlদেবে, বাকিটি দেবে pathName(আপনার ক্ষেত্রে /one/two)


আপনি কীভাবে এই সমাধানটি কাজ করে তা ব্যাখ্যা করতে পারেন। স্ট্যাক ওভারফ্লোতে কোডের উত্তর পোস্ট করা এড়িয়ে চলুন।
আর্কিথ

@ আরকাথ বিশদভাবে জানিয়েছে।
আওয়েস আইয়ুব

1

এই তথ্যের জন্য আপনাকে ধন্যবাদ। এটি অবিশ্বাস্যরকম বিরক্তিকর।

এটি আপনার কোডে যুক্ত করুন এবং আপনাকে এটি নিয়ে আর কখনও ভাবতে হবে না:

var app = express();

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

আপনি সেখানে অন্যান্য জিনিস যেমন সেট করতে পারেন যেমন কনসোলে লগ করুন।


0

কেবল নীচের কোডটি আমার পক্ষে যথেষ্ট ছিল!

const baseUrl = `${request.protocol}://${request.headers.host}`;
// http://127.0.0.1:3333
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.