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


9

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']);
?>

解決しよう:rewriteルールでindex.phpの前に/を追加すると、それが機能しました:

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


どのルールセットを使用しましたか?私はそれらの両方を試しましたが、どちらもうまく機能しています。mod_rewriteが有効になっていますか?
Manuel Faux、

mod_rewriteがアクティブでない場合、サーバーは起動しませんでした。これが重要な場合、これはWinXP上のApache 2.2です。
jmucchiello 2009

回答:


12

Apacheを使用している場合は、次のようにしてrewritesを使用します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サーバーによって提供される実際のファイルにアクセスするために必要です。


上記の編集を参照してください。エラー400を取得する
jmucchiello

サーバーに送信した正確なリクエストは何ですか?サーバーにmod_rewriteがインストールされていますか?そうでないと、構文エラーのために起動しないためです。
Manuel Faux、

編集は正確なリクエストを示しています:localhost:8181およびlocalhost:8181 / abc。書き換えルールを削除すると、/を含むindex.phpと/ abcを含む通常の404が取得されます。
jmucchiello 2009

index.phpの前に/を追加すると、問題が修正されます。
jmucchiello 2009

神秘的です...私はスラッシュなしでテストしました、そしてそれはapache-2.2.11-8で私のために働きました。
Manuel Faux、

1

以下のコードは、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)から収集できます 。


上記の編集を参照してください。エラー400取得
jmucchiello

両方の答えを正しく設定できればいいのですが。
jmucchiello 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.