В настоящее время я использую CodeIgniter 3. Я хочу создавать динамические субдомены, такие как team1.domain.com, team2.domain.com и т. Д.

Эти домены должны указывать на контроллер Team и, в частности, на метод show_Team в этом контроллере.

Я прочитал несколько проверок качества на StackOverflow, но, похоже, ни один из них не работает для меня.

В настоящее время у меня есть:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ./index.php [L,QSA]

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).domain.com [NC]
RewriteRule (.*) /index.php/team/$1/ [L,QSA]

И как маршрут:

$route['team/(:any)'] = "Team/show_Team";

Но это дает мне внутреннюю ошибку 500 .

Несколько немного разных вариантов, опубликованных на StackOverflow, также не работают.

Обновить

Журнал ошибок дает мне:

[Wed Jan 04 09:52:15.013871 2017] [core:error] [pid 4792:tid 1332] (OS 123)The filename, directory name, or volume label syntax is incorrect.  : [client 127.0.0.1:61066] AH00132: file permissions deny server access: proxy:http://team1.domain.com/Team/show_Team/, referer: team1.domain.com/Team/show_Team/

Когда я обновил его до (как указано в комментариях):

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.domain\.com$ [NC]
RewriteRule (.*) /index.php/team/$1/ [L,QSA]

Это дает мне эту ошибку:

[Wed Jan 04 10:01:35.959839 2017] [core:error] [pid 4792:tid 1320] [client 127.0.0.1:61351] AH00124: 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://team1.domain.com/
2
PostMans 4 Янв 2017 в 11:49
Итак, что ваш файл журнала ошибок http-сервера сообщает вам о причине этой внутренней ошибки?
 – 
arkascha
4 Янв 2017 в 11:56
И, кстати, это должно быть ^([a-z0-9-]+)\.domain\.com$ ...
 – 
arkascha
4 Янв 2017 в 11:56
Также я не вижу, что вы на самом деле используете имя хоста, которое вы позаботились записать в этом состоянии.
 – 
arkascha
4 Янв 2017 в 11:58
1
Конечно, бесконечный цикл перенаправления возникает из-за того, что в next циклическом переходе через механизм перезаписи одно и то же условие, очевидно, также совпадает ... Вы можете предотвратить это, используя флаг END вместо L в более новых версиях apache, в более старых версиях требуется дополнительное условие. И , как сказано: вы должны сделать что-нибудь с этим именем хоста, которое вы захватили ...
 – 
arkascha
4 Янв 2017 в 12:10
1
Скобки в ([a-z0-9-]+) захватывают имя хоста, строку перед буквальной точкой, следующей за ним. Обычно вы снимаете это, потому что хотите использовать позже, иначе зачем снимать? Обычно передается такая вещь, как дополнительный аргумент GET или переменная окружения.
 – 
arkascha
4 Янв 2017 в 13:08

1 ответ

Лучший ответ

Попробуй это; Объясняю в комментариях:

Options +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /

    # If it's not a file being accessed
    RewriteCond %{REQUEST_FILENAME} !-f
    # If it's not a directory being accessed
    RewriteCond %{REQUEST_FILENAME} !-d
    # And if it's domain.com, with or without www (no subdomain)
    RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$
    # Rewrite all requests to index.php adding the query
    # string (QSA) and terminating all subsequent rewrite 
    # processings.
    # See: https://httpd.apache.org/docs/current/rewrite/flags.html#flag_end 
    RewriteRule ^(.*)$ /index.php/$1 [END,QSA]

    # If it's not starting with www
    RewriteCond %{HTTP_HOST} !^www
    # And is a subdomain
    RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.domain\.com$ [NC]
    # Rewrite the request to index.php/test/SUBDOMAIN/whatever...
    RewriteRule ^(.*)$ /index.php/team/%1/$1 [END,QSA]
</IfModule>

## Results:
# domain.com/foo/bar       => /index.php/foo/bar
# www.domain.com/foo/bar   => /index.php/foo/bar
# team1.domain.com/foo/bar => /index.php/team/team1/foo/bar
# team2.domain.com/foo/bar => /index.php/team/team2/foo/bar

Здесь я предположил, что вы хотите передать SUBDOMAIN в качестве своего рода идентификатора команды методу контроллера.

Тогда ваш маршрут должен быть примерно таким:

$route['team/(.+)'] = "Team/show_Team/$1";

В отличие от (:any), который соответствует только одному сегменту, (.+) может соответствовать нескольким сегментам. $1 - это обратная ссылка на то, что было захвачено с помощью (.+).

Все, что находится после team/, будет передано вашему методу контроллера в качестве аргументов:

class Team extends CI_Controller {

    // ...

    public function show_Team($team_id, $foo, $bar) {
        // ...    
    }
}
3
sepehr 4 Янв 2017 в 13:36
Спасибо, я немного потестил, и ваш результат правильный. Однако теперь я вижу, что это перенаправление на index.php / team / team1 вместо того, чтобы URL-адрес оставался на team1.domain.com . После дальнейшего поиска в Google, похоже, CodeIgniter не может справиться с этим правильно?
 – 
PostMans
4 Янв 2017 в 15:36
У меня есть подстановочный DNS, но я предполагаю, что хостер должен что-то делать в части @ Apache (как вы предложили). Я свяжусь с ними. Спасибо за ответ
 – 
PostMans
4 Янв 2017 в 16:45
team1.domain.com попадает в ваше приложение CodeIgniter?
 – 
sepehr
4 Янв 2017 в 16:53
Да, теперь это так, однако team1.domain.com теперь переходит в domain.com/team/team1 (как маршрут в routes.php). Я думаю, что хостеру нужно что-то менять в Apache (как вы сказали)
 – 
PostMans
4 Янв 2017 в 16:58