mod_rewrite:检查是否不是某个域

时间:2013-06-30 04:37:00

标签: apache .htaccess mod-rewrite

我正在从一个正在运行的网络应用中迁移一些代码,但无法让它在新服务器上运行。似乎所有内容都配置正确,但我在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}

任何人都可以在第二个块中看到导致重定向限制错误的问题吗?重写可能有些不对劲?感谢。

1 个答案:

答案 0 :(得分:0)

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

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

请参阅section about RewriteCond in the Apache manual

其次,您将获得无限重写,因为您的第二个规则块使用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$

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