web-dev-qa-db-ja.com

すべてのURLを単一のPHPファイルで実行するにはどうすればよいですか?

URLがこれらの形式であるMVCシステムは、どのようにしてすべてのリクエストを単一のindex.phpファイルに強制するのですか?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

編集:以下の書き換えルールを試すと、次のエラーが発生します。

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

編集:ああ、これは/index.phpの完全な内容です。書き換えルールを削除すると、「/」または「/index.php」が出力されるか、それ以外の場合は404が返されます。

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

解決しよう:私は書き換えルールのindex.phpの前に/を追加し、それが機能しました:

解決済み:2.2.4を実行していたため、/が必要だったことが判明2.2.11にアップグレードすると、/は不要になりました。

9
jmucchiello

Apacheを使用している場合は、mod_rewrite

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

これにより、URLが"index.php?q = foo/bar/baz"に透過的に書き換えられます。

2.と3.の行は、既存のファイルまたはディレクトリを指している場合、URLを書き換えないように書き換えエンジンに指示します。これは、httpdサーバーによって提供される実際のファイルにアクセスするために必要です。

12
Manuel Faux

以下のコードは、Apacheのmod_rewriteを使用して、index.phpにマップされる物理ファイルまたはディレクトリを指していないすべてのURLを書き換えます。最終結果は次のようになります。

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

書き換えルール:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

説明:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

上記の両方の行は、この規則が通常のファイル(-f)またはディレクトリ(-d)に適用されないことを示しています。

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Mod_rewriteルールの作成方法の詳細については、Apache Webサイト http://httpd.Apache.org/docs/2.2/mod/mod_rewrite.html から収集できます。

1
nabrond