2012-04-18 31 views
4

我有一个.htaccess规则,基本上指明了通过一个页面的所有访问,并且我从那一点PHP处理它。因此,无论它在哪个目录中,它都会将所有网址传递给此脚本。如何重写url的子集(/ api/something)?

如果我的根/项目/(example.com/project/some/page/where)/一些/页/哪里会重定向到@ frontend.php

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

我已经达到但是,我希望能够将部分页面推送到不同的处理程序,例如(example.com/project/api/page/where,而不是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 

回答

1

的问题是,第二个请求也是针对htaccess进行测试的,所以实际上您有两个请求。因为这个规则不适用于任何js/ico/gif。 您可以使用RewriteConds或regileros(更好)的方法使用Apache的{ENV:REDIRECT_STATUS}机制来管理此操作。有关更多信息,请参阅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] 
+0

这很接近。虽然没有RewriteBase工作。至此,这就是为什么@ frontend.php规则工作得如此之好以至于我不必设置RewriteBase。 – 2012-04-20 21:14:11

+0

我不得不承认,我真的不知道fronted.php之前的标志是干什么的(完成任何事情?)。显然,你可以有没有RewriteBase的规则,你只需要写下相对路径。为了让它没有RewriteBase,我编辑了我的示例。 – Jan 2012-04-21 06:02:12

+0

谢谢。 @符号除了使文件更加模糊之外别无其他,因此大多数人不会轻描淡写。它根本没有URL重写的目的。如果我想要,我可以使用_,〜或=。 – 2012-04-21 13:34:18

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框架的设置,它的工作比较顺利。上述规则的组合应该可以帮助你走上正轨。

让我知道你是否想让我为你的确切设置做进一步澄清。

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之后的内容有什么意义...

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

缺少文件扩展名排除。除此之外,这套规则是有效的。 – 2012-04-27 14:53:12

+0

好的......编辑后:) – smrtl 2012-04-28 00:02:01

+0

现在,/ api /地址不再工作。 mod_rewrite,你是一个痛苦的屁股。 – 2012-04-28 13:32:42