Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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 500错误。重写规则不能正常工作_.htaccess_Mod Rewrite - Fatal编程技术网

.htaccess 500错误。重写规则不能正常工作

.htaccess 500错误。重写规则不能正常工作,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我的.htaccess重写规则之一有问题: 服务器详细信息: 服务器运行的是LiteSpeed Webserver而不是Apache,根据我的主机提供商的说法,它与Apache mod_rewrite 100%兼容。 问题: 使用此代码时,我收到500个内部服务器错误: <IfModule mod_rewrite.c> Options +FollowSymLinks Options +Indexes RewriteEngine On RewriteBase /

我的.htaccess重写规则之一有问题: 服务器详细信息: 服务器运行的是LiteSpeed Webserver而不是Apache,根据我的主机提供商的说法,它与Apache mod_rewrite 100%兼容。
问题: 使用此代码时,我收到500个内部服务器错误:

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  Options +Indexes  
   RewriteEngine On
   RewriteBase /
   RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
   RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
   RewriteRule ^(.*)$  %2/$1 [L,QSA,NC]
</IfModule>

选项+FollowSymLinks
选项+索引
重新启动发动机
重写基/
重写cond%{HTTP_HOST}^www\.mysite\.com$[NC]
重写cond%{HTTP_HOST}^(www.)?([a-z0-9-]+).mysite.com$[NC]
重写规则^(.*)$%2/$1[L,QSA,NC]
当我使用这段代码时,它几乎完成了它应该做的事情,它将流量从任何子域重定向到相应的子文件夹,并请求文件。没有错误,没有任何问题它工作正常,但它也改变了浏览器的地址,这是我不希望的

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  Options +Indexes  
   RewriteEngine On
   RewriteBase /
   RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
   RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
   RewriteRule ^(.*)$  http://mysite.com/%2/$1 [L,QSA,NC]
</IfModule>

选项+FollowSymLinks
选项+索引
重新启动发动机
重写基/
重写cond%{HTTP_HOST}^www\.mysite\.com$[NC]
重写cond%{HTTP_HOST}^(www.)?([a-z0-9-]+).mysite.com$[NC]
重写规则^(.*)$http://mysite.com/%2/$1[L,QSA,北卡罗来纳州]
有什么想法吗

Editetd:我想提到的一件事是,我使用通配符DNS,因为子域实际上并不存在。 再次编辑:RewriteRule^(.*)$%2/index.php[L,QSA,NC]如果我使用此规则并尝试访问某个服务器,它会成功地将其重定向到我不明白为什么它不能使用$1而不是index.php,当我更改它们时,我会收到500个内部服务器错误

现在得到了解决方案:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options +Indexes  
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} ^(.*)mysite\.com$ [NC]
RewriteCond   %{HTTP_HOST} !^www\.* [NC]
RewriteRule ^(.*)$ http://www.%1mysite.com/$1 [R=301,L,QSA] [NC]
RewriteCond %{HTTP_HOST}     !^www\.mysite\.com$              [NC]
RewriteCond %{HTTP_HOST}     ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteCond %2==$1           !^(.*)==\1                                        
RewriteRule ^(.*) %2/$1$2$3   [L,QSA,NC]
</IfModule>

选项+FollowSymLinks
选项+索引
重新启动发动机
重写基/
重写条件%{ENV:REDIRECT_STATUS}!200
RewriteCond%{HTTP_HOST}^(.*)mysite\.com$[NC]
重写cond%{HTTP_HOST}^www\.[NC]
重写规则^(.*)$http://www.%1mysite.com/$1[R=301,L,QSA][NC]
重写cond%{HTTP_HOST}^www\.mysite\.com$[NC]
重写cond%{HTTP_HOST}^(www.)?([a-z0-9-]+).mysite.com$[NC]
重写条件%2==1美元^(.*)==\1                                        
重写规则^(.*)%2/$1$2$3[L,QSA,NC]

这是因为它正在创建一个无限重写循环。
123.mysite.com/
被重写为
123.mysite.com/123/
,它被重写为
123.mysite.com/123/123/

尝试使用此选项来防止此循环:

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteRule ^(.*)$  %2/$1 [L,QSA,NC]

我认为你的规则应该改写如下:

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteCond %{HTTP_HOST} !^(www\.)?mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.mysite\.com$ [NC]
RewriteRule ^ http://mysite.com/%2%{REQUEST_URI} [L,P]

p标志将使它像一个代理一样,并将在浏览器中保留指向
subdomain.mysite.com/whatever
的URL,而不是
mysite.com/subdomain/whatever
这是一个有趣的通用问题,需要一个通用解决方案,那么:

#
# Rule matches ('fred','','')    for pattern 'fred'
#              ('123','/',fred') for pattern '123/fred'
# At cond 2 %2 is the subdomain e.g. 123 for www.123.mysite.com
# Hence cond 3 pattern is 123==123 for www.123.mysite.com/123/fred
# and this will match ^(.*?)==\1 or fail its negation
#
RewriteCond %{HTTP_HOST}     !^www\.mysite\.com$              [NC]
RewriteCond %{HTTP_HOST}     ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteCond %2==$1           !^(.*?)==\1                                        
RewriteRule ^([^/]*)(/?)(.*) %1/$1$2$3                        [L]

对于500个错误检查服务器的错误日志-他们会告诉你一切。我只是不认为是这种情况,它的工作,如果我使用的代码,事实上,它的工作非常完美,但正如我在我的问题中发布它重定向到webbrowser。。。我只想指向mysite.com/subdomain_folder/which,在网络浏览器中,地址栏应该显示。。。事实上,我认为问题在于服务器如何解释$1变量对不起,我从你的问题中复制了错误的代码。我编辑了它,它现在应该可以工作了。你不想把重定向_状态条件提高一个,这样就可以从上一次的
RewriteCond
设置%2,这样就可以正确地执行重写规则了吗?我真傻。谢谢你发现了@TerryE。再次编辑。对不起,乔治,我被难住了。我只是在我自己的服务器上测试了它,只是为了确定,它工作正常。500号。尝试将代码重新键入新文件,以确保文本中没有隐藏字符。否则我恐怕帮不了你。阿努巴瓦,我对你使用[代理]标志很感兴趣。当然,这取决于加载的mod_代理,还需要相应的
ProxyPassReverse
指令支持。由于可能存在利用漏洞的问题,大多数主机提供程序和LAMP堆栈禁用mod_proxy。@TerryE:OP希望在域名发生更改时重定向,但OP仍然不希望外部重定向,也不希望更改浏览器的URL。IMO的“P”是实现这一点的唯一方法,因为“R”肯定会更改浏览器中的URL。但是,我不确定“P”是否可用于OP。不工作,但无论如何,谢谢。顺便说一句,我对子域使用通配符dns,我们在这里讨论的.htaccess文件位于主域的根目录中。
不工作
对于试图回答您的问题的人来说从来都不是一个有用的错误:)您是否收到500个内部错误?还是说你在打循环?请提供Apache的error.log或access.log中的匹配行。这就是我在这里与@TerryE讨论的内容。P flag提供了此功能,但它需要启用mod_代理。现在重定向工作正常,但现在我遇到了一件愚蠢的事情:)当我尝试访问测试子域中的index.php时,它会重定向到domain.com/test/index.php,这正是我所希望的。问题是,在测试中,我使用了一个类似于domain.com中的index.php,只是我没有将domain.com索引的image pictures和style.css放在测试子文件夹中,但当我第一次访问test.domain.com时,它使用domain.com中的style.css,当我按下refresh时,我不再使用它,只是显示不带css的文本,这是正常的。你能告诉我为什么它第一次使用domain.com的风格吗?我设法解决了这个问题,用www重写了所有的流量,现在一切正常。谢谢。