htaccess перенаправляет все поддомены в один каталог
Я хочу иметь возможность перенаправлять все поддомены в папку:
RewriteCond %{HTTP_HOST} ^([^/.]+).example.com$
RewriteRule (.+)$ "http://example.com/subdomains/%1" [L,P]
например, если некоторые визиты sub1.example.com
он сохранит URL, но покажет example.com/subdomains/sub1
и если каталог sub1 не существует, он покажет example.com/404
это возможно?
я попробовал приведенный выше код, но он показывает мне:
Forbidden
You don't have permission to access /index.php on this server.
Wordpress говорит:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
и в верхней части моего файла htaccess:
RewriteEngine On
DirectoryIndex index.php
RewriteCond %{HTTP_HOST} admin.domain.com$
RewriteRule ^(.*)$ /admin/system/ [L]
2 ответов
ваш выше .htaccess будет перенаправлять вызовы извне, так как вы используете полный URL-адрес в качестве цели.
в вашем вопросе вы говорите, что хотите сохранить имя хоста, поэтому я предположу, что это требование.
0) включить rewrite engine
RewriteEngine On
1) переписывание известных поддоменов в их каталог в / subdomains
# Rewrite known subdomains to /subdomains/{subdomain}/
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$
RewriteCond %{REQUEST_URI} !^/subdomains [NC]
RewriteCond %{REQUEST_URI} !^/404 [NC]
RewriteRule ^(.+)$ /subdomains/%1/ [L]
- когда мы сталкиваемся с запросом с поддоменом,
- и мы не переписали его на / поддомены
- и мы не переписали его на /404
- затем перепишите его в / subdomains / {subdomain}/
Итак, если запрос был
http://foo.example.com/hello
URL в браузере останется прежним, но внутренне будет сопоставлен с
/subdomains/foo/
2) переписывание неизвестных поддоменов в /404
# Rewrite missing unknown subdomains to /404/
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$
RewriteCond %{REQUEST_URI} ^/subdomains [NC]
RewriteCond %{REQUEST_URI} !^/404 [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ /404/ [L]
- когда мы сталкиваемся с запросом с поддоменом,
- и мы уже переписали его / поддомены
- и мы не переписали его на /404
- и он не существует в виде файла
- и он не существует как каталог
- и он не существует как символическая ссылка
- затем перепишите его на /404
Итак, если запрос был
http://bar.example.com/hello
URL в браузере останется прежним, но внутренне будет сопоставлен с
/subdomains/bar/
первый RewriteRule
от 1).
если /subdomains/bar/
не существует, вторым RewriteRule
из 2) будет пинать и внутренне сопоставлять его с
/404/
3) Тестовая Среда
Я на самом деле протестировал все это с образцовым кодом, доступным здесь:https://github.com/janpapenbrock/stackoverflow-36497197
Я бы сказал, что у вас возникла проблема с разрешением. Я думаю, ваш сервер Apache работает как apache
пользователей. Использовать chmod
дать apache
доступ к этому пути.