Ошибка .htaccess 500.RewriteRule не работает как надо - PullRequest
0 голосов
/ 26 января 2012

У меня проблема с одним из моих .htaccess rewriterule: Детали сервера: Сервер работает на LiteSpeed ​​Webserver, а не на Apache, по словам моего хост-провайдера, он на 100% совместим с apache mod_rewrite.
Проблема: Я получаю 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>

Когда я использую этот код, он в значительной степени делает то, что должен, он перенаправляет трафик из любого субдомена в соответствующую подпапку с запросом файла. Нет ошибок, нет ничего, все работает нормально, но также изменяет адрес браузера, который мне не нужен.

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

Есть идеи?

Editetd: Одна вещь, которую я хотел бы упомянуть, это то, что я использую подстановочный DNS, субдомен на самом деле не существует. Еще раз отредактировано: RewriteRule ^ (. *) $% 2 / index.php [L, QSA, NC], если я использую это правило и пытаюсь получить доступ к http://sub.mysite.com/whatever, оно успешно перенаправляет его на http://mysite.com/sub/index.php Я не понимаю, почему он не работает с $ 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>

Ответы [ 3 ]

0 голосов
/ 27 января 2012

Я думаю, что ваше правило должно быть переписано так:

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 заставит его действовать как прокси и будет сохранять URL-адрес в браузере subdomain.mysite.com/whatever вместо mysite.com/subdomain/whatever

0 голосов
/ 27 января 2012

Это интересная общая проблема, которая заслуживает общего решения, как насчет:

#
# 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]
0 голосов
/ 26 января 2012

Это потому, что он создает бесконечный цикл перезаписи. 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]
...