ドメインのルートにない場合にリンクが適切な場所に確実に移動するための最良の方法/実践方法は何ですか?
-
05-09-2019 - |
質問
私はしばらくこれについて疑問に思っていましたが、Webアプリ(RoR、Sinatra、PHPなど)でリンクを作成するとき(メソッドで生成するか、またはhand) ドメインのルートにいるかどうかに関係なく、適切な場所に移動するようにします。 http://www.example.com/ または http://www.example.com/this/is/where/the/app/is/
私の考えでは、エンドユーザーにアプリの構成のどこかにドキュメント ルートを指定してもらい、それを使用してもらうことを考えていますが、エンドユーザーが何も構成する必要なしにそれを行う良い方法を考えようとしています。
編集:エンドユーザーとは、サーバー上にアプリケーションをセットアップする人を意味します。
編集:先頭の「/」を使用すると、常にドメインに関連するリンクを取得できますが、問題は、アプリ自体がルートではなく、次のような場所にある場合はどうなるかということです。 http://www.example.com/this/is/where/the/app/is/ だから私は言いたいです gen_link('/')
そしてそれを返してもらいます /this/is/where/the/app/is/
または gen_link('/some/thing')
そして戻る /this/is/where/the/app/is/some/thing
解決
を設定してみてはいかがでしょうか base
HTMLレイアウトの頭にある要素は何ですか?
まず、URL を取得します。Ilya が提案する方法で (PHP がOKなら)。その後、使用できるようになります base
次のようにタグを付けます。
<base href="<?= $full_site_url ?>" />
これにより、すべてのリンクのデフォルト URL が設定され、ブラウザはその URL をページ上のすべての相対リンクの前に追加します。
他のヒント
まず第一に、ある種の URL リライター機能を通じてすべての URL をルーティングする必要があります。
したがって、次のことは行わなくなります。
<a href="some/path/">Foo</a>
しかし、代わりに次のようなものがあります:
<a href="<%= url_for('some/path') %>">Foo</a>
世の中のすべての Web フレームワークにはこのような機能があります。通常、そこではあらゆる種類の魔法 (MVC コントローラーのパスやビューなどを扱うため) が行われますが、関数の最後には (概念的には) すべて URL の前に「ルート」が追加されます (例: "/this/is/where/the/app/is/"
)、ハードコーディングされたベース パスから独立した URL をアプリケーション内で作成できるようにします。
RoR は、と呼ばれる構成ディレクティブを使用します。 "relative_url_root"
.
Symfony (php) は、とも呼ばれる設定ディレクティブを使用します。 "relative_url_root"
.
CakePHP は、と呼ばれる設定ディレクティブを使用します。 "WEBROOT_DIR"
.
これらのフレームワークが Apache 上で実行されている場合、この値は多くの場合 (明示的に設定していない場合) 動的に計算されます。他の Web サーバーでは、環境変数が利用できないか正しくないことが多いため、この値を一貫して決定することはできません。
イリヤの答えは良いものですが、これを行うためのより簡単な方法は、すべてのリンクの前に「/」を付けることだけだと思います。これにより、それらは常にドメインのルートに対して相対的なものになります。
<a href="/some/thing">Something</a> <!-- Always links to www.domain.com/some/thing -->
<a href="some/thing">Something</a> <!-- Acutal destination depends current path -->
必要なものはすべて自分で決定でき、構成は必要ありません。
PHP の例を次に示します (index.php がスクリプト名だとします)。
<?
$folder_on_server = substr ($_SERVER['PHP_SELF'], 0, strpos ($_SERVER['PHP_SELF'], '/index.php'));
$server_name = $_SERVER['SERVER_NAME'];
if (80 != $_SERVER['SERVER_PORT']) {
$server_name .= ':'. $_SERVER['SERVER_PORT'];
}
$full_site_url = 'http://'. $server_name . $folder_on_server;
?>
これで、いつでも次のようなリンクを作成できます。
<a href="<?= $full_site_url ?>/some/thing/">Something</a>
コメントでの議論も参照してください。