.htaccess mod_rewrite:通过%{HTTP_HOST}将子域重写到目录时出错 mod\u重写问题
谈到Apache的.htaccess mod_rewrite:通过%{HTTP_HOST}将子域重写到目录时出错 mod\u重写问题,.htaccess,mod-rewrite,subdomain,.htaccess,Mod Rewrite,Subdomain,谈到Apache的mod_rewrite,我遇到的麻烦比我想象的要多。我已经在网上发布了一个问题 这件事已经澄清了,但我继续犯错误,因为我看不到问题中的任何逻辑错误 配置任何帮助都将不胜感激 我使用的.htaccess如下所示: # Begin Rewrite Module for http://*.example.com/ # ============================================== <IfModule mod_rewrite.c> #
mod_rewrite
,我遇到的麻烦比我想象的要多。我已经在网上发布了一个问题
这件事已经澄清了,但我继续犯错误,因为我看不到问题中的任何逻辑错误
配置任何帮助都将不胜感激
我使用的.htaccess
如下所示:
# Begin Rewrite Module for http://*.example.com/
# ==============================================
<IfModule mod_rewrite.c>
# Turn the rewrite engine on and set the base path.
RewriteEngine On
RewriteBase /
# Map subdomains to their respective directories.
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]
</IfModule>
我找到了一种解决方案,通过在RewriteRule上为[END]
标志替换[L]
标志,它可以完美地将请求URI精确地映射到子域目录中的相应文件
不幸的是,它工作得太完美了。调用subdomain.example.com/folder/
会在不考虑目录索引的情况下内部重写为example.com/public\u subdomains/subdomain/subdomain/folder/folder/
(假设将index.php
设置为目录索引)
如果有人能帮我阐明这一点,我将永远感激 嗯,这里有一个逻辑错误。让我让您参考下面的精彩控制流程图: 你看,内部重定向也是一个请求,所以它再次被所有重写规则处理。因此,假设一个用户请求something.example.com/x:RewriteRule macthes,RewriteCond被满足,那么一个内部重定向到public_子域/something/x。新请求是到something.example.com/public_subdomains/something/x:RewriteRule matches,RewriteCond已完成。。。这里有一个无止境的循环 [L]标志仅停止处理当前请求:请求仍将在第二次传递中处理。[END]标志确实会停止循环,但这是一个蛮力的东西,正如您所注意到的,它有副作用,所以最好合并一个停止递归的条件。大概是这样的:
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/public_subdomains/%1
RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]
添加的重写条件将检查请求的uri是否已经以“public_subdomains/something”开头
它未经测试,因此可能会有问题,但这是基本思想。好吧,这里有一个逻辑错误。让我让您参考下面的精彩控制流程图: 你看,内部重定向也是一个请求,所以它再次被所有重写规则处理。因此,假设一个用户请求something.example.com/x:RewriteRule macthes,RewriteCond被满足,那么一个内部重定向到public_子域/something/x。新请求是到something.example.com/public_subdomains/something/x:RewriteRule matches,RewriteCond已完成。。。这里有一个无止境的循环 [L]标志仅停止处理当前请求:请求仍将在第二次传递中处理。[END]标志确实会停止循环,但这是一个蛮力的东西,正如您所注意到的,它有副作用,所以最好合并一个停止递归的条件。大概是这样的:
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/public_subdomains/%1
RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]
添加的重写条件将检查请求的uri是否已经以“public_subdomains/something”开头
它未经测试,因此可能会有问题,但这是基本思想。我认为您将URL与系统路径混合在一起。这个
http://example.com/index.php
这个/public\u html/index.php
指向同一个文件。在.htaccess文件中,该标志是隐含的,只应使用URL。也许你的问题中还有其他问题,但这一点很明显。我编辑了这个问题,从示例重写列表中删除了/public\u html
,但没有使用系统路径。所有路径都是相对于文档根的(这是我在前面的问题中解决的问题)。但是指出了系统路径和URL之间的区别,这是一种荣誉——我花了好几天的时间试图理解这个问题!您是否尝试过使用至少RewrterLogLevel 3的RewriteLog?这可以帮助您进行调试。我发现:RewriteRule(.*)public_子域/%1/$1[L]可能有问题
但RewriteLog会告诉您更多信息。请澄清您是否希望重定向URI为http://example.com/public_subdomains/subdomain/folder/index.php
或http://subdomain.example.com/public_subdomains/subdomain/folder/index.php
?我认为您将URL与系统路径混为一谈。这个http://example.com/index.php
这个/public\u html/index.php
指向同一个文件。在.htaccess文件中,该标志是隐含的,只应使用URL。也许你的问题中还有其他问题,但这一点很明显。我编辑了这个问题,从示例重写列表中删除了/public\u html
,但没有使用系统路径。所有路径都是相对于文档根的(这是我在前面的问题中解决的问题)。但是指出了系统路径和URL之间的区别,这是一种荣誉——我花了好几天的时间试图理解这个问题!您是否尝试过使用至少RewrterLogLevel 3的RewriteLog?这可以帮助您进行调试。我发现:RewriteRule(.*)public_子域/%1/$1[L]可能有问题
但RewriteLog会告诉您更多信息。请澄清您是否希望重定向URI为http://example.com/public_subdomains/subdomain/folder/index.php
或http://subdomain.example.com/public_subdomains/subdomain/folder/index.php
?我发现添加重写规则^public\u子域-[L]
在重写规则比添加另一个RewriteCond
@mootinator更干净之前,这看起来绝对更为惯用、更好。尽管它没有提供解决方案(最终通过访问DNS记录解决了问题),你的回答值得赏金——我相信,这一书面解释将在未来对我有所帮助。我发现添加RewriteRule^public\u子域-[L]