0

だから、私が構築しているPHPアプリでURLを少しいじっています。

.htaccess を使用して mod_rewrite を使用しています。これは次のようになります。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php/$1
</IfModule>

URLが以下のように書かれていると思いました:

http://localdomain.com/controller

$_SERVER['PATH_INFO'] の一部として、'controller' が問題なく終了することを期待します。ただし、Apache 2.2.22 を実行している Ubuntu 12.04 では、代わりに 404 Not Found エラーが発生します。

NOT FOUND
The requested URL /index.php/controller was not found on this server.

index.php に続くスラッシュの後に「コントローラー」が適切にアドレス指定されているようですが、予想される応答ではなく 404 が返される理由を知っている人はいますか?

最終的に、私が構築している MVC フレームワークで使用する「コントローラー」をキャプチャしようとしています。

この場合、私は非常に単純な index.php を持っています:

<?php
echo $_SERVER['PATH_INFO'];

それでも、予想されるパス情報ではなく、404 エラーが表示されます。

注: http://localdomain.com/またはhttp://localdomain.com/index.phpにアクセスするだけでも問題なく動作します。mod_rewrite がオンで機能しており、AllowOverride が All に設定されています。

4

3 に答える 3

2

Apache 2.2.22 を実行している場合、コントローラー関数が見つかった場合、PHP コードは 200 応答を指定する役割を果たします。

Apache 2.2.22 は、2.2.14 と比較して、書き換えに関して異なる哲学を採用しているようです。長い話ですが、理にかなっています。CodeIgniter のようにフロント コントローラーに書き換える場合、PHP コードは要求された URI が見つかったかどうかを判断する責任があると想定しています。Apache は PHP コードがヘッダー ('HTTP/1.1 200 OK') を送信するのを待ち、送信されない場合はヘッダー ('HTTP/1.1 404 Not Found') を送信します。

興味深いことに、コントローラーからの実際のコンテンツは、おそらく応答本文でも送信されます。しかし、応答コードが 404 (MSIE、wget など) の場合、多くの HTTP クライアントはそれを無視します。

短いバージョンでは、Apache 2.2.14 (プラチナ上) は楽観的で、PHP で特に指定されていない限り 200 を想定していますが、Apache 2.2.22 は悲観的で、PHP で特に指定されていない限り 404 を想定しています。

したがって、コードのどこかに次を配置する必要があります。

header('HTTP/1.1 200 OK');

これは、フロントコントローラーが URI が有効であり、クラスとメソッドが存在し、この URI に対して呼び出すことができると判断した直後、ただしクラスとメソッドが実際に呼び出される前に配置する必要があります。

CodeIgniter 2.1.3 では、次のようになります。

// Added this line for Apache 2.2.22
header('HTTP/1.0 200 OK');
// Call the requested method.
// Any URI segments present (besides the class/function) will be passed to the method for convenience
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
于 2012-10-12T19:26:27.947 に答える
0

index.phpを含まないURLが書き換えられることを期待している場合は、次を使用してください。

RewriteRule ^(.*)$ index.php [NC,L]
于 2012-07-06T19:47:34.733 に答える
0

私が作成して MVC に使用した .htaccess は次のとおりです。

# Mod Rewrite
<IfModule mod_rewrite.c>
    RewriteEngine On

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

    RewriteRule ^(.*)$          /root/index.php/$1 [PT,L]
</IfModule>

^$+を追加してみてください[PT,L]

于 2012-07-06T19:45:30.520 に答える