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]
  1. когда мы сталкиваемся с запросом с поддоменом,
  2. и мы не переписали его на / поддомены
  3. и мы не переписали его на /404
  4. затем перепишите его в / 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]
  1. когда мы сталкиваемся с запросом с поддоменом,
  2. и мы уже переписали его / поддомены
  3. и мы не переписали его на /404
  4. и он не существует в виде файла
  5. и он не существует как каталог
  6. и он не существует как символическая ссылка
  7. затем перепишите его на /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 доступ к этому пути.