请解释我,比如我5 - RewriteRules,请

时间:2016-05-22 07:08:31

标签: regex apache .htaccess mod-rewrite url-rewriting

我尝试了解如何在Apache(mod_rewrite模块)中管理子域 在这个网站上:
http://htaccess.madewithlove.be/

以下链接:

http://www.sub.tst.com/foo/bar.php  

根据这条规则:

RewriteRule (.*)bar(.*)$ $1oxo$2 [PT]

返回:

✔ The new url is http://www.sub.tst.com/foo/oxo.php

但遵循以下规则(或任何其他类似规则):

RewriteRule (.*)tst(.*)$ $1oxo$2 [PT]

它返回错误:

✖ This rule was not met.

我想将带有子域名的链接重定向到正确的子文件夹(到 tst.com/sub/foo/bar 链接 - 如果存在的话),所以我想我只是必须将 www.sub.tst.com/foo/bar.php 分成2个块,其中包含' sub'和' /foo/bar.php'我放在&#t; tst.com' (并从中删除' .php'扩展名),但到目前为止,正则表达式并不像我期望的那样处理重写规则(并且我在php上测试它)。 怎么了?怎么做对吗?在我在我的网站上使用它之前如何测试它?

1 个答案:

答案 0 :(得分:1)

搜索模式使用标准正则表达式。因此,在您的情况下,括号构成regex group。匹配的第一个将取代$1,依此类推。还记得正则表达式是贪婪的。那就是他们会尽可能地匹配。

您的RewriteRule与您的示例不匹配的原因是因为PATTERN仅针对" [...]主机名和端口之后的网址部分进行检查"

要完成您想要的操作,您可能希望将RewriteCondRewriteRule结合使用。因此,基本上使用RewriteCond来确定子域是否匹配,然后完全重写域部分。例如:

RewriteCond %{HTTP_HOST} ^www.sub.tst.com [NC]
RewriteRule ^(.*)$ http://tst.com/sub/$1 [L]

在这种情况下,RewriteCond将作为以下RewriteRule的if语句。

它不漂亮,但它可能会为你做的工作。

更新:根据cooba和olaf的评论。

您可以使用以下规则完成所需的操作

RewriteCond %{HTTP_HOST} !www.tst.com [NC]
RewriteCond %{HTTP_HOST} ^(www.)*(([^.]*).)tst.com [NC]
RewriteRule ^(.*)$ http://tst.com/%3/$1 [L]

从第二个RewriteCond开始。在这里,需要正则表达式^(www.)的第一部分来查找域包含www或不包含www的情况(www.sub.tst.com或sub.tst.com)。

正则表达式(([^.]*)\.)的第二部分与子域匹配。我们想要的部分是内部组(没有.的组)。评估正则表达式时,该内部组占据位置3.要在RewriteRule中访问该值,请使用%

现在,需要第一个RewriteCond来保护将www.tst.com重写为tst.com/www/.