4

我有一个 .htaccess 规则,它基本上指向一个页面的所有访问,我让 PHP 从那时开始处理它。因此,无论它位于哪个目录,它都会将所有 URL 传递给该脚本。

如果我的根目录是 /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,而不是 example.com/project/some/ api/哪里):

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
4

3 回答 3

1

问题是第二个请求也针对 htaccess 进行了测试,所以实际上你有两个请求。因为没有任何符合规则的 js/ico/gif。您可以使用 Apache 的 {ENV:REDIRECT_STATUS} 机制通过 RewriteConds 或 regileros(更好的)方法来管理它。有关详细信息,请参阅问题。

编辑:我在http://playground.rexbooks.com/stack设置了一个小例子。如果您输入,fe http://playground.rexbooks.com/stack/api/123456它会将您重定向到 api.php。任何其他查询将被重定向到 frontend.php。线索是检查文件是否真的存在。我也拆分了你的其他规则。RewriteBase 仅用于我的设置,您需要对其进行调整。为了不使 uris 透明,请删除 rewrite (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]
于 2012-04-18T06:17:43.193 回答
1

在包含“@frontend.php”和“@api.php”文件的目录中放置一个.htaccess,内容如下:

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]
于 2012-04-25T10:45:51.533 回答
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 框架设置,它运行得非常顺利。上述规则的组合应该可以帮助您继续前进。

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

于 2012-04-24T15:20:12.390 回答