我有一个.htaccess规则,基本上所有的访问都指向一个页面,我让PHP从这一点开始处理它。因此,无论它位于哪个目录中,它都会将所有URL传递给此脚本。
如果我的根目录是/project/ ( example.com/project/some/page/where ),那么/some/page/会被重定向到@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发布于 2012-04-18 14:17:43
问题是,第二个请求也是针对htaccess进行测试的,因此您实际上有两个请求。因为没有符合规则的js/ico/gif。您可以使用RewriteConds或使用Apache的{ENV:REDIRECT_STATUS}机制的regileros (更好)方法来管理这一点。有关详细信息,请参阅this问题。
编辑:我在http://playground.rexbooks.com/stack上设置了一个小示例。如果你键入,f.e.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-25 18:45:52
在包含"@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之后使用它,那么捕获api之后的内容又有什么意义呢?
RewriteRule ^api(/.*)? @api.php [L]发布于 2012-04-24 23:20:12
这就是你要的。这些类型的规则对我很有效:
# 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框架设置,并且运行得相当顺利。以上规则的组合应该会帮助你开始行动。
如果你想让我为你的确切设置做进一步的说明,请告诉我。
https://stackoverflow.com/questions/10202018
复制相似问题