我尝试了解如何在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上测试它)。 怎么了?怎么做对吗?在我在我的网站上使用它之前如何测试它?
答案 0 :(得分:1)
搜索模式使用标准正则表达式。因此,在您的情况下,括号构成regex group。匹配的第一个将取代$1
,依此类推。还记得正则表达式是贪婪的。那就是他们会尽可能地匹配。
您的RewriteRule
与您的示例不匹配的原因是因为PATTERN仅针对" [...]主机名和端口之后的网址部分进行检查"
要完成您想要的操作,您可能希望将RewriteCond
与RewriteRule
结合使用。因此,基本上使用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/.