我正试图用PHP创建一个基本的REST风格的API,但我遇到了一个奇怪的问题。当我通过URL/rest/viewinput.php访问我的一个页面(viewinput.php)时,页面加载良好。当我尝试通过/rest/viewinput时,我会得到一个"找不到页面"的错误。
因此,这是决定请求类型和发送位置的代码
//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服务器的教程,它运行得很好。
以下是我的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>
您的重写规则编写不正确。实际情况是,当您转到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