我有一个.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
答案 0 :(得分:1)
问题是第二个请求也是针对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]
答案 1 :(得分:1)
将.htaccess放在包含“@ frontend.php”和“@ api.php”文件的目录中,其中包含以下内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api @api.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ @frontend.php [QSA,L]
!-f
将阻止对任何现有文件的重写。
要仅拒绝指定扩展的重写,请使用以下.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$
RewriteRule ^api @api.php [QSA,L]
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$
RewriteRule ^ @frontend.php [QSA,L]
当然下面这行也应该有效,但是如果我们不使用api之后捕获api之后的内容有什么意义...
RewriteRule ^api(/.*)? @api.php [L]
答案 2 :(得分:0)
你走了。这些类型的规则对我有用:
# redirect Drupal urls straight to Drupal (or in your case api.php)
RewriteRule ^admin/(.*)$ api.php?q=admin/$1 [L,QSA]
RewriteRule ^admin_menu/(.*)$ api.php?q=admin_menu/$1 [L,QSA]
RewriteRule ^node/(.*)$ api.php?q=node/$1 [L,QSA]
RewriteRule ^content/(.*)$ api.php?q=content/$1 [L,QSA]
# Another way to redirect based on query strings
RewriteCond %{QUERY_STRING} ^q=([^&]+)$
RewriteRule . api.php?q=$1 [L,QSA]
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
# otherwise forward it to index.php
RewriteRule . index.php
我已经开始运行以集成Drupal / Yii框架设置,并且它运行得非常顺利。上述规则的组合应该可以帮助您实现目标。
如果您希望我进一步澄清您的确切设置,请告诉我。