WordPressブログURLにはこの表記があります。章.phpには別のパスがあります。サーバー上の実際の既存のディレクトリではありません。私の質問は、彼らがそれをどのように行うのですか?私の簡単なPHPウェブサイトでそのようなことをすることはできますか?
blog/index.php/author/
index.php
(物理ファイルにマップする)を含むこの特定のURL形式は、追加のパス名情報を使用します。 /author/
リクエストをルーティングします。サーバーによる追加のURL書き換えは必要ありません。
すべてのリクエストは、ファイル/blog/index.php
によって処理されます(URL自体に記載されているとおり)。 index.php
内で、PHPスーパーグローバル$_SERVER['PATH_INFO']
を使用してパス名情報を参照し、リクエストをどう処理するかを決定できます。サンプルURLの場合、$_SERVER['PATH_INFO']
は文字列/author/
を保持します(前述のとおり)。
これを実行するには、サーバーでPATH INFOを有効にする必要があります(そうでない場合、Apacheでは、システムで生成された404がトリガーされるだけです)。 PHPハンドラーのパス情報はデフォルトで有効になっています。
私の簡単なPHPウェブサイトでそのようなことをすることはできますか?
はい。ただし、既存のサイトに実装するのがどれほど簡単で、既存のURL構造を改善できるかどうかは別の問題です。
持っている場合、実際に静的なサイトであり、ファイルを直接提供しています(つまり、URLはファイルシステムパスに直接マップされます(例:/blog/author.php
))。 URL構造自体に。
これは/blog/author/
という形式のURLとは異なることに注意してください(index.php
がないことではありません)。これには、サーバー上で追加のURL書き換えが必要になります。
(通常)このタイプのURLはいつ使用しますか?
すべてのリクエストを「フロントコントローラー」(例:index.php
)経由でルーティングしたいが、サーバー書き換えエンジンにアクセスできない場合。コンテンツは何らかのデータベースに保存されている可能性があり、「フロントコントローラー」は特定のリクエストURLに対するレスポンスの作成方法を知っています。
たとえば、index.php
には次のようなものがあります。
<?php
$content = [
'STATUS' => 200,
'TITLE' => null,
'BODY' => null,
];
$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : null;
if ($url == '/author/') {
// Lookup content from database or other file etc....
$content['TITLE'] = 'Author';
$content['BODY'] = '<p>My name is bob.</p>';
}
elseif ($url == '/contact/') {
// Lookup content from database or other file etc...
$content['TITLE'] = 'Contact Me';
$content['BODY'] = '<p>Please complete the form below...</p>';
}
else {
$content['STATUS'] = 404;
$content['TITLE'] = '404 Not Found';
$content['BODY'] = 'Sorry, could not find the page you requested.';
}
http_response_code($content['STATUS']);
?>
<html>
<head>
<title><?={$content['TITLE']}?></title>
</head>
<body>
<?={$content['BODY']}?>
</body>
</html>