web-dev-qa-db-ja.com

blog / index.php / author / phpページにこの種のURLを作成する方法

WordPressブログURLにはこの表記があります。章.phpには別のパスがあります。サーバー上の実際の既存のディレクトリではありません。私の質問は、彼らがそれをどのように行うのですか?私の簡単なPHPウェブサイトでそのようなことをすることはできますか?

3

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>
2
MrWhite