Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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子域到文件夹_.htaccess_Mod Rewrite - Fatal编程技术网

.htaccess子域到文件夹

.htaccess子域到文件夹,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我最近对我网站的文件夹结构做了一些小改动,现在我的一条重写规则似乎被打破了 在过去,我在公共html中有一个/mydomain.com/文件夹,其中设置了wiki。在同一个文件夹中有一些我用来访问子域的文件夹,如成员和文件 旧设置: #www to main website RewriteCond %{HTTP_HOST} ^www.mydomain.com$ RewriteRule ^(.*)$ mydomain.com/$1 [L] #subdomain to folder (member

我最近对我网站的文件夹结构做了一些小改动,现在我的一条重写规则似乎被打破了

在过去,我在公共html中有一个/mydomain.com/文件夹,其中设置了wiki。在同一个文件夹中有一些我用来访问子域的文件夹,如成员和文件

旧设置:

#www to main website
RewriteCond %{HTTP_HOST} ^www.mydomain.com$
RewriteRule ^(.*)$ mydomain.com/$1 [L]

#subdomain to folder (members. => /members/, files. => /files/, etc)
RewriteCond %{HTTP_HOST} ^(.*).mydomain.com$
RewriteCond %{HTTP_HOST} !^www.mydomain.com$
RewriteRule ^(.*)$ mydomain.com/%1/$1 [L]
相当简单,当我输入files.mydomain.com/myfile.zip时,它工作起来没有任何问题

最近,我在我的维基上安装了几种语言(事实上与问题无关,但只是为了详细说明情况),我制定了以下规则:

#to the right language folder (www = en)
RewriteCond %{HTTP_HOST} ^(www|nl|es).mydomain.com$
RewriteRule ^(.*)$ mydomain.com/%1/$1 [L]

#subdomain to folder (members. => /members/, files. => /files/, etc)
RewriteCond %{HTTP_HOST} ^(.*).mydomain.com$
RewriteCond %{HTTP_HOST} !^www.mydomain.com$
RewriteRule ^(.*)$ mydomain.com/misc/%1/$1 [L]
显然,在mydomain.com/www/、mydomain.com/es/等中设置了不同语言的wiki。这非常好。 问题在于第二部分,即子文件夹。在同一个mydomain.com/文件夹中,我创建了一个misc/文件夹来存储所有misc内容(包括子域文件夹)。我想只要在路径中添加/misc/(就像我在第一条规则中添加了语言文件夹名称)就可以了。。但它给了我一个500的误差。 旧设置和新设置在任何文件夹中都没有可能与第二条规则冲突的.htaccess行


有谁能发现错误,或者告诉我如何系统地检查此设置是否存在错误吗?

我认为防止重定向循环发生的最简单方法就是检查您是否已经将URL重写到了预期的位置。我们可以用几种不同的方法来实现这一点;如果您知道该文件在重写后将存在,则可以在
%{REQUEST\u FILENAME}上设置条件-例如,f

在您的情况下,由于您正在将所有内容重写到
/public\u html
目录中的一个公共文件夹中,因此我们只需检查是否已完成:

#to the right language folder (www = en)
RewriteCond %{HTTP_HOST} ^(www|nl|es)\.example\.com$
RewriteCond %{REQUEST_URI} !^/example\.com
RewriteRule ^(.*)$ example.com/%1/$1 [L]

#subdomain to folder (members. => /members/, files. => /files/, etc)
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/example\.com
RewriteRule ^(.*)$ example.com/misc/%1/$1 [L]

诚然,我不知道你现在为什么会遇到问题,但以前没有。我在我的测试服务器上运行了您的原始规则集,由于太多的内部重定向,最终出现了一个内部服务器错误,因此我们的设置中肯定存在差异。无论如何,希望这能为您带来好处。

我希望您的旧设置和新设置都会产生500个错误。您的旧设置是否在关闭了
mod_rewrite
的子目录中包含
.htaccess
文件?嗯,不,据我所知,只是一些mediawiki特定的规则(仅当URI中包含/wiki/时才适用)。为什么会出现错误?您的规则将导致无限重定向循环。在Apache错误日志中,它可能会说“由于可能的配置错误,请求超出了10个内部重定向的限制”?但是第一条规则没有给出错误。。您建议如何尝试修复此问题?我稍后会尝试,但/example.com/子文件夹在任何时候都不应位于uri中。。重写规则中没有[R]标志,因此它应该保持隐藏状态。我可以尝试检查文件是否存在,但如果我输入了错误的文件名,这意味着我仍然会收到服务器错误,而不是常规的404。而且,这应该意味着第一条规则也不起作用,但它确实起作用了。错误在于两条规则之间存在差异,但我不知道有什么不同。我已经检查了htaccess文件中的第一条规则,但也找不到任何东西。@Litso-我忘记解释这一点,但是在您执行初始重写以包括新的内部请求路径后,
%{REQUEST\u URI}
的值在内部被更改,即使用户看不到该转换,这就是为什么我们可以进行检查。谢谢,我不知道最后一部分。在uri中检查/example.com/似乎确实有效,毕竟,我应该听:P至少我今天学到了一些东西。@Litso-啊哈!我想我也明白了为什么设置之间会出现问题,尽管这是我自己的猜测。以前,当您只有一个wiki时,
/example.com
中是否有单独的wiki
.htaccess
文件?如果是这样,并且假设在安装新语言时,
.htaccess
文件被移动到相应的语言目录中,在原始设置中,对文件的请求与wiki的
.htaccess
文件位于相同的请求路径上,并且忽略了
/public\u html
目录中的规则(规则集与父目录中的规则集不结合)…我以为不是这样,但你提出了一个很好的观点。也许这确实发生了…至少现在一切都正常了!谢谢大家:)