【问题标题】:Mod_rewrite repetitionmod_rewrite 重复
【发布时间】:2009-03-12 03:04:07
【问题描述】:

我正在开发一个通过单个 PHP 页面 (passthrough.php) 传递所有 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 规则不适合,但输出规则适合,所以应用了,然后 URL 最终被 passthrough.php 规则再次重写,导致以下 GET vars:

路径: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 =方法,一气呵成?它似乎是为每个匹配的规则运行一次.htaccess,而不是解析URL,根据下一条规则更改,根据下一条规则更改等等。

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

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    试试这个:

    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]
    

    【讨论】:

    • 这很接近——它消除了方法路径的错误,所有的方法都搞砸了,但不会同时执行输出格式和 ajax。我将使用它,然后解析 PHP 中的路径以获取它错过的内容。谢谢!
    【解决方案2】:

    老实说,我认为将 PATH_INFO 传递给 passthrough.php 并在脚本中解析它是错误的。通过 (ab) 使用 mod_rewrite 的方式,您正在为维护噩梦做好准备。

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2012-04-17
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多