3

リダイレクトなしで HTTP リクエストの URL を変更することは可能ですか?

たとえば、次の代わりに:

リクエスト1

GET /user/abc123/ HTTP/1.1

HTTP/1.1 301 Moved Permanently
Location: /files/abc123

リクエスト 2

GET /files/abc123 HTTP/1.1

HTTP/1.1 200 OK
.
.
[filecontent]

ファイルに直接応答することもできますが、リダイレクトされたことをクライアントに知らせます。

単一のリクエスト

GET /user/abc123/ HTTP/1.1

HTTP/1.1 200 OK
Location: /files/abc123
.
.
[filecontent]
4

3 に答える 3

1

私の知る限り、HTTP でこれを行うことはできません。HTTP でのリダイレクトとは、具体的には、クライアントが 2 番目のリクエストを送信することになっていることを意味します。

あなたが望むのは、いくつかのリソースに「正規URL」を指定し、この正規URLをブラウザのロケーションバーに表示することに似ていると思います。

RFC 6596は、<link rel="canonical">. ただし、ブラウザが何をすべきかは指定されていません。Google はこれを使用して、インデックスに登録する URL をより適切に選択します。

タグを使用する以外に、HTTPヘッダー<link>を介してリソース間の関係を指定することもできます。http://www.w3.org/wiki/LinkHeaderを参照してください。ただし、これがGoogleに取り上げられるかどうかはわかりません。http://support.google.com/webmasters/bin/answer.py?hl=en&answer=139394のページには、Google がサポートしているとは記載されていません。実質的にすべてのリンク タグと同じように、ブラウザはこれを無視しますが、スタイルシートは顕著な例外です。LinkLink: </better-url>; rel=canonical

問題のコンテンツが HTML ドキュメントの場合は、HTML5 履歴 APIを使用できます。具体的には、history.replaceStateメソッドを使用します。他の種類のコンテンツで同様のことを達成することは不可能だと思います。

編集

Content-Locationヘッダーは、実際にあなたが望むものに非常にうまく適合する場合があります。HTTP 1.1 RFC のセクション 14.14 から:

Content-Location エンティティ ヘッダー フィールドは、エンティティが要求されたリソースの URI とは別の場所からアクセスできる場合に、メッセージに含まれるエンティティのリソースの場所を提供するために使用される場合があります。サーバーは、応答エンティティに対応するバリアントに Content-Location を提供する必要があります。特に、リソースに複数のエンティティが関連付けられており、それらのエンティティが実際には個別にアクセスできる個別の場所を持っている場合、サーバーは返される特定のバリアントに Content-Location を提供する必要があります。

  Content-Location = "Content-Location" ":"
                     ( absoluteURI | relativeURI )

Content-Location の値は、エンティティのベース URI も定義します。

Content-Location 値は、元の要求された URI の代わりではありません。これは、リクエスト時のこの特定のエンティティに対応するリソースの場所のステートメントにすぎません。その特定のエンティティのソースを識別したい場合、将来のリクエストは Content-Location URI を request-URI として指定してもよい (MAY)。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

HTTP ヘッダー フィールド「Content-Location」の目的は何ですか?も参照してください。

于 2013-05-08T11:06:31.570 に答える
1

まあ、それ可能ですが、少し汚れているように感じます.

簡単なデモ:

var express = require('express');
var app     = express();

app.get('/user/abc123', function(req, res, next) {
  req.path = req.url = '/files/abc123';
  next();
});

app.get('/files/abc123', function(req, res) {
  res.set('Location', req.url);
  res.send('files!');
});

app.listen(3012);
于 2013-05-08T12:36:07.950 に答える
0

This is my simple approach, not just change the originalUrl but the path too. My method suggestions:

app.use(function(req, res, next) {
    console.log("request", req.originalUrl);
    const removeOnRoutes = '/not-wanted-route-part';
    req.originalUrl = req.originalUrl.replace(removeOnRoutes,'');
    req.path = req.path.replace(removeOnRoutes,'');
    return next();
});

By this way /not-wanted-route-part/users will became /users

于 2019-08-08T18:05:43.060 に答える