Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess mod_rewrite:通过%{HTTP_HOST}将子域重写到目录时出错 mod\u重写问题_.htaccess_Mod Rewrite_Subdomain - Fatal编程技术网

.htaccess mod_rewrite:通过%{HTTP_HOST}将子域重写到目录时出错 mod\u重写问题

.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> #

谈到Apache的
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]