2016-01-20 2 views
1

Я хочу перенаправить все запросы в файл perl, который должен обрабатывать их в зависимости от поддомена..htaccess перенаправить все запросы в файл perl

Я попытался с помощью этого .htaccess:

Options +ExecCGI 
AddHandler fcgid-script .pl 
RewriteEngine On 

RewriteCond %{HTTP_HOST} ^(.+?)\.example\.com$ 
RewriteRule ^(.*)$ /%1/main.pl/$1 [L] 

Я бы ожидать, что, если я пытаюсь открыть master.example.com, что мой ~/HTML-корень/мастер/main.pl бы получить выполнен, но вместо этого я получаю «Внутреннюю ошибку сервера».

error_log Apache говорит

[Wed Jan 20 18:06:36 2016] [error] [client xxx.xxx.xxx.xxx] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: http://master.example.com/ 

Если я пытаюсь посетить example.com/master/main.pl мой скрипт запускается на выполнение только штрафом.

Что я делаю неправильно?

ответ

0

Я нашел своего рода обходной путь:

Options +ExecCGI 
AddHandler fcgid-script .pl 
RewriteEngine On 

RewriteCond %{ENV:REDIRECT_ENV} !^.+$ 
RewriteCond %{HTTP_HOST} ^(.+?)\.example\.com$ 
RewriteRule ^(.*)$ /%1/main.pl/$1 [L,E=ENV:%1] 

Вместо того, чтобы не пересылают запросы к /\1/main.pl я установить переменную окружения на первом редиректа. Если эта переменная задана, я больше не делаю перенаправления, получая выход из бесконечного цикла, который в противном случае будет происходить.

1

Попробуй правила таким образом,

Options +ExecCGI 
AddHandler fcgid-script .pl 
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(.+?)\.example\.com$ 
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/? [NC] 
RewriteRule ^(.*)$ /%1/main.pl/$1 [L] 
+0

Это работает. Не могли бы вы объяснить мне, что делает ваша линия? – dave

+0

@dave Проблема в том, что вам нужно убедиться, что вы игнорируете подпапку, на которую указываете. В вашем случае это 'dynamic', потому что это зависит от субдомена. Вы не можете использовать backreference в регулярном выражении rewritecond. Таким образом, это правило использует backrefence '% 1' в левой части строки, сопоставляя и группируя блок текста до :: и сравнивая с помощью ссылки' \ 1'. Это в основном статический эквивалент 'RewriteCond% {REQUEST_URI}! ^/Master [NC]' –

+0

master.example.com/master снова вызывает ошибку. На этот раз он говорит Forbidden ... – dave

Смежные вопросы