В настоящее время я использую 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/
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) {
// ...
}
}
R
. Однако вам нужно будет сопоставить все эти поддомены таким образом, чтобы они соответствовали вашему приложению. Вероятно, вам понадобится запись CNAME с подстановочными знаками. После этого вам также необходимо настроить Apache, чтобы он знал о поддоменах с подстановочными знаками.
team1.domain.com
попадает в ваше приложение CodeIgniter?
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это широко используемый язык сценариев общего назначения с открытым исходным кодом, мультипарадигмальный, динамически типизированный и интерпретируемый, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
^([a-z0-9-]+)\.domain\.com$
...END
вместоL
в более новых версиях apache, в более старых версиях требуется дополнительное условие. И , как сказано: вы должны сделать что-нибудь с этим именем хоста, которое вы захватили ...([a-z0-9-]+)
захватывают имя хоста, строку перед буквальной точкой, следующей за ним. Обычно вы снимаете это, потому что хотите использовать позже, иначе зачем снимать? Обычно передается такая вещь, как дополнительный аргумент GET или переменная окружения.