我正在开发一个通过单个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脚本的特殊条件来解决,但这并没有很好地解决,并且对我来说“感觉”不对。
答案 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来为自己做一个维护噩梦。