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

时间:2012-04-18 02:34:05

标签: apache mod-rewrite

我有一个.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

3 个答案:

答案 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框架设置,并且它运行得非常顺利。上述规则的组合应该可以帮助您实现目标。

如果您希望我进一步澄清您的确切设置,请告诉我。