0

PHP で基本的な REST スタイルの API を作成しようとしていますが、奇妙な問題が発生しています。URL /rest/viewinput.php から自分のページ (viewinput.php) の 1 つにアクセスすると、ページが正常に読み込まれます。/rest/viewinput を試すと、「ページが見つかりません」というエラーが表示されます。

リクエストのタイプと送信先を決定するコードは次のとおりです。これは私のserver.phpページにあります

//in server.php
public function serve() {
    $uri = $_SERVER['REQUEST_URI'];
    $method = $_SERVER['REQUEST_METHOD'];
    $paths = explode('/', $this->paths($uri));
    array_shift($paths); // 
    $resource = array_shift($paths);

if ($resource == 'rest') {
        $page = array_shift($paths);
        if (empty($page)) {
            $this->handle_base($method);
    } else {
    $this->handle_page($method, $page);
        }

    }
    else {
        // We only handle resources under 'clients'
        header('HTTP/1.1 404 Not Found');
    } 
}

ページ名が決まっているGETメソッドなので、この関数に渡されます

//in server.php
private function handle_page($method, $page) {
    switch($method) {  

    case 'GET':
    if($page == "viewinput"){ //I have both viewinput.php and viewinput just to check both. Only viewinput.php works
       $this->display_info();
    }
     if($page == "viewinput.php"){
       $this->display_info();
    }

    default:
        header('HTTP/1.1 405 Method Not Allowed');
        header('Allow: GET, PUT, DELETE');
        break;
    }
}

ここから次に送信されます

//in server.php
function display_info(){
$view = new ViewInputs(); 
$view->view();  //this function is on viewinput.php
}

そのため、/rest/viewinput.php にアクセスすると、ビュー関数が正しく表示されます。/rest/viewinput にアクセスすると、「壊れたリンク」エラーが発生します。

私はRESTサーバーのFound Hereのオンラインチュートリアルに従いましたが、うまくいきました。

以下は私のhttpd.confファイルにあります

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^/.* rest/server.php

これは私の viewinput.php ファイルです。正しく動作していると思います (ページが読み込まれると、server.php の serve 関数が実行されるはずです。

<?
include_once 'server.php';
class ViewInputs{

  function view(){
      $sql = mysql_query("select * from entry");
      ?> 
      <table>
          <th>ID</th>
          <th>Text</th>
          <col width="200">
          <col width="150">
        <?
        while ($result = mysql_fetch_array($sql)){
            ?>
            <tr><td><? echo $result['id']." "; ?></td><td><? echo $result['text']; ?></td></tr>
            <?
        }
        ?> </table> <?
    }
}
$server = new server();
$server->serve(); 
?>

httpd.conf から。私は間違っているかもしれませんが、これが .htaccess ファイルを許可する方法だと思います

DocumentRoot "C:/xampp/htdocs/rest"

<Directory />
   Options FollowSymLinks
   AllowOverride ALL
   Order deny, allow
   Deny from none
</Directory>

<Files ".ht*">
Require all ALLOW
</Files>
4

1 に答える 1

1

書き換えルールが正しく記述されていません。何が起こっているかというと、rest/viewinput.php に移動すると、そのファイルが実際に存在するため、実行できます。rest/viewinput に移動すると、そのファイルは存在しません。http://martinmelin.se/rewrite-rule-tester/にアクセスすると、書き換えルールを確認できます。書き換えルールが不適切であることがわかります。

これを行うポイントは、veiwinput.php ファイルを持たないようにすることです。すべてを server.php ファイルに直接送信する必要があります。ほとんどの場合、必要な書き換えルールは次のようなものです。

RewriteRule rest/* rest/server.php

実際に viewinput.php に移動したい場合は、書き換えルールを設定しても意味がありません。削除するだけです。

rest/viewinput を rest/viewinput.php として扱いたい場合は、次を使用します。

RewriteRule ^rest/([a-z]+) rest/$1.php
于 2012-09-05T17:37:31.530 に答える