apache – 如何重写url的子集(/ api / something)?

我有一个.htaccess规则,基本上指向通过一个页面的所有访问,我从那时起有
PHP处理它.因此,无论它在哪个目录中,它都会将所有URL传递给此脚本.

如果我的root是/ project /(example.com/project/some/page/where),/ some / page / where会被重定向到@ frontend.php

RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$@frontend.php

然而,我已经达到了一个目的,我希望能够将一部分页面推送到不同的处理程序,就像这样(example.com/project/api/page/where,not example.com/project/some/ api / where):

RewriteRule ^/api?$@api.php

问题是,无论此规则是高于还是低于另一个规则,这都不起作用.任何人都可以建议我怎么做到这一点?

我也尝试过:

RewriteRule ^/api(/.*)? @api.php [L]

RewriteCond %{REQUEST_URI} !/api
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$@frontend.php [L]

虽然这有效,因为http://example.com/project/api/page/where没有被推送到@ frontend.php,但它没有得到@ api.php,并产生:

[Wed Apr 18 10:46:12 2012] [error] [client 127.0.0.1] File does not exist: /www/project/api

编辑:

我的最新尝试是:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api(/.*)? @api.php [L]

RewriteCond %{REQUEST_URI} ^api
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$@frontend.php

这个的问题是,如果URL以api /之外的任何内容开头,例如(example.com/project/test/page/where),它会抛出错误:

[Sat Apr 21 10:50:13 2012] [error] [client 127.0.0.1] File does not exist: C:/xampp/www/projects/frame3/test

最佳答案 问题是第二个请求也是针对htaccess进行测试的,所以实际上你有两个请求.因为没有js / ico / gif规则适合.

您可以使用Apache的{ENV:REDIRECT_STATUS}机制使用RewriteConds或regileros(更好)方法来管理它.有关详细信息,请参阅
this问题.

编辑:我在http://playground.rexbooks.com/stack设置了一个小例子.如果你输入,f.e. http://playground.rexbooks.com/stack/api/123456它会将你重定向到api.php.任何其他查询都将重定向到frontend.php.线索是检查文件是否真的存在.我也把你的另一条规则分开了. RewriteBase仅适用于我的设置,您需要进行调整.若要不使uris透明,请删除重写(R)标志.这是你追求的吗?

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api(/.*)? /api.php [L,R]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !api
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$
RewriteRule (.*) /frontend.php [L,R]
点赞