2009-02-25 33 views
0

我正在通过一个PHP页面(passthrough.php)传递所有PHP脚本的网站上工作。Mod_rewrite重复

.htaccess文件是假设需要某些特殊目录并将它们转换为GET变量,因此控制器脚本知道如何处理它们。所以:

http://example.com/ajax/method.php 

成为

http://example.com/passthrough.php?path=method.php&mode=ajax 

http://example.com/ajax/json/method.php 

成为

http://example.com/passthrough.php?path=method.php&mode=ajax&output=json 

等。这是我在我的.htaccess文件:

RewriteRule ajax/(.*)$ $1?mode=ajax [QSA] 
RewriteRule (xml|json)/(.*)$ $2?output=$1 [QSA] 

RewriteRule (.*)\.php$ passthrough.php?path=$1 [QSA] 
RewriteRule passthrough.php - [L] 

在我的第二个例子,mod_rewrite的执行AJAX规则,那么它看起来像它执行passthrough.php规则。然后,它看起来运行重写过程。现在,ajax规则不适用,但输出规则确实适用,然后最终通过passthrough.php规则重新编写该URL,这会导致以下GET变量:

path:method。 php/json/method.php/json/method 输出:json mode:ajax

我的问题是:有没有办法让重写引擎一次处理整个URL?所以url以/ajax/json/method.php形式出现,变成/json/method.php?mode=ajax,然后/method.php?mode=ajax & output = json,然后/pas​​sthrough.php?mode=ajax & output = json & path =方法,全部一起去吗?对于每个匹配的规则,它似乎都会通过.htaccess运行一次,而不是解析URL,根据下一个规则进行更改,基于下一个规则进行更改,等等。

我试过使用几个标志,包括[PT]和[S],但它们记录不完整。这个问题可以通过编写将代码直接传递给传递脚本的特殊条件来解决,但这并不是很好的解决方案,并且对我来说并不“感觉”。

回答

0

试试这个:

RewriteRule ^passthrough\.php$ - [L] 
RewriteRule !\.php$ - [L] 
RewriteRule ^ajax/(.*) passthrough.php?path=$1&mode=ajax [L,QSA] 
RewriteRule ^(xml|json)/(.*) passthrough.php?path=$2&output=$1 [L,QSA] 
+0

这样就会关闭 - 它会将所有方法的路径全部搞乱,但不会同时输出格式和ajax。我将使用它,然后解析PHP中的路径以获取它错过的内容。谢谢! – stdave 2009-04-03 19:12:01

0

老实说,我认为你是错的说,经过PATH_INFOpassthrough.php和脚本解析它。 (ab)使用mod_rewrite的方式设置自己的维护噩梦。