RewriteCond on .htaccess

时间:2011-01-20 19:36:16

标签: php apache api rest

我正在为我的网络服务编写RESTful API 我想以下模式的所有调用触发一个位于/myserver/api/controller.php的php文件 模式是:
HTTP:/www.mydomain.com/api/user
HTTP:/www.mydomain.com/api/resource

基本上,http://www.mydomain.com/api/ *的所有调用都应触发/api/controller.php

目前,我的.htaccess位于/ api,看起来像这样:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . controller.php

更新1:
父目录中的.htaccess是:

RewriteEngine On
RewriteCond %{HTTP_HOST} !:9000$
RewriteCond %{SCRIPT_FILENAME} \.php$ [OR]
RewriteCond %{REQUEST_URI} ^$
RewriteRule ^(.*)$ http://%{HTTP_HOST}:9000/$1 [P,L]
RedirectMatch 301 /jobs$ http://someurl
RedirectMatch 301 /support/$ http://someurl
RedirectMatch 301 /jobs$ http://someurl
RedirectMatch 301 /someurlA http://someurlB

我应该如何编写.htaccess文件?

谢谢!

3 个答案:

答案 0 :(得分:2)

这个怎么样:

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

这会将/api/user/5之类的请求重定向到/api/controller.php?q=user/5。 “QSA”还将保留已存在的任何查询字符串变量。

答案 1 :(得分:1)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.* controller.php [L]

更新

RewriteEngine On
RewriteBase /api
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.* controller.php [L]

答案 2 :(得分:0)

目前尚不清楚Apache是​​否正在阅读你的.htaccess文件。尝试将Wooga非指令放在那里,看看是否收到500错误。

此外,除非您别无选择,否则不要将.htaccess文件用于mod_rewrite(或其他任何内容)。

更新1

好的,所以你的.htaccess文件正在被阅读。下一步是尝试更简单的规则。类似的东西:

RewriteEngine On
RewriteRule ^ http://httpd.apache.org/

如果有效,那么你知道mod_rewrite正在运行,问题在于你的规则中的匹配。

更新2

所以mod_rewrite工作正常,这意味着你的规则不匹配。尝试删除条件,但保留规则不变。

RewriteEngine On
RewriteRule . controller.php

如果这会导致循环,请将其更改为:

RewriteEngine On
RewriteRule !controller.php controller.php