Mod_rewrite重复

时间:2009-02-25 22:20:07

标签: apache mod-rewrite

我正在开发一个通过单个PHP页面传递所有PHP脚本的网站(passthrough.php)。

.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 模式:ajax

我的问题是:有没有办法让重写引擎一次性处理整个URL?所以url以/ajax/json/method.php的形式出现,变为/json/method.php?mode=ajax,然后是/method.php?mode=ajax&output=json,然后是/passthrough.php?mode=ajax& ; output = json& path = method,一气呵成?它似乎是针对每个匹配的规则运行.htaccess一次,而不是解析URL,根据下一个规则进行更改,根据下一个规则进行更改,等等。

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

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

老实说,我认为将PATH_INFO传递给passthrough.php并在脚本中解析它是错误的。你正在通过(ab)按照你的方式使用mod_rewrite来为自己做一个维护噩梦。