0

我正在从正在运行的 Web 应用程序迁移一些代码,但无法让它在新服务器上运行。一切似乎都配置正确,但我在 Apache2 中遇到内部重定向限制错误。这是我的重写和解释

这有效 - 任何不是 cdn 的子域。或管理。应该重定向到 u.php

RewriteCond %{HTTP_HOST} ^(^.*)\.mediasprk\.com$ [NC]
RewriteCond ^(.*)$ !^(cdn|manage)$
RewriteCond %{REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ u.php?uri=$1&hostName=%{HTTP_HOST}

这不再有效。这里的目标是处理 CName 指向。因此,如果它不是我的应用程序域 (mediasprk.com),则通过将其发送到 u.php 来处理它。

RewriteCond %{HTTP_HOST} !^mediasprk\.com$ [NC]
RewriteCond %{REQUEST_URI) !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ u.php?uri=$1&hostName=%{HTTP_HOST}

任何人都可以在第二个块中看到会导致重定向限制错误的问题吗?也许重写中有问题?谢谢。

4

1 回答 1

0

我可以在这里看到两个问题。首先,我不相信您的第一个 RewriteCond 指令是有效且有意义的:

RewriteCond ^(.*)$ !^(cdn|manage)$

请参阅Apache 手册中有关 RewriteCond 的部分

其次,您将获得无限重写,因为您的第二个规则块使用 HTTP_HOST 值(域名)作为测试条件,但未能修改 HTTP_HOST 值。换句话说,如果 RewriteCond 测试匹配(并且域名不是“mediasprk.com”),那么 RewriteRule 只是告诉 Apache 将路径更改为同一域上的不同内容。大多数人没有意识到的是,重写的路径*必须从顶部经过 mod_rewrite 规则*。因此,重写的路径将保留在初始请求使用的任何域上,这意味着 RewriteCond 将再次匹配,并且重写将再次发生。然后再一次。依此类推,直到您收到服务器错误,告诉您已达到重写限制。

您可以通过将 RewriteRule 更改为:

RewriteRule ^(.*)$ http://www.mediasprk.com/u.php?uri=$1&hostName=%{HTTP_HOST}

但这将导致浏览器重定向而不是静默重写。

打破无限循环的另一种方法是检查请求是否尚未请求 u.php 文件,因此您可以在该 RewriteRule 之前添加一个额外的 RewriteCond:

RewriteCond %{REQUEST_URI} !^/u\.php$

无论哪种方式,您都需要打破当前指令创建的无限循环。

于 2013-06-30T16:18:17.400 回答