У меня есть VirtualHost, на котором я хотел бы иметь несколько поддоменов. (Для ясности предположим, что мой домен example.com и я просто пытаюсь начать с создания foo.example.com работать и строить оттуда.)
Самый простой способ, который я нашел для субдомена, чтобы он работал неинвазивно с имеющейся у меня структурой, - это прокси на суб-путь через mod_rewrite. Таким образом, пути будут отображаться в адресной строке клиента как http://foo.example.com/( что угодно) в то время как они на самом деле будут обслуживаться http://foo.example.com/foo/( что угодно) под капотом.
Мне удалось сделать это в моем конфигурационном файле VirtualHost следующим образом:
ServerAlias *.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^foo\.example\.com [NC] # <---
RewriteCond %{REQUEST_URI} !^/foo/.*$ [NC] # AND is implicit with above
RewriteRule ^/(.*)$ /foo/$1 [PT]
(Примечание: было на удивление трудно найти эту конкретную рабочую комбинацию. В частности, [PT], казалось, был необходим для RewriteRule. Я не мог заставить его работать с примерами, которые я видел в других местах, например [L], или просто пытаясь [P] . Он либо ничего не показывал, либо зацикливался. Кроме того, некоторые браузеры, казалось, кэшировали страницы ответов для плохих циклов, как только они их получили ... перезагрузка страницы после исправления не показывала, что она работает! Обратная связь приветствуется - в в любом случае - если эту часть можно сделать лучше.)
Теперь я хочу сделать то, что http://foo.example.com/foo/( что угодно) предоставляет зависит от того, кто спросил. Если запрос пришел извне, я бы хотел, чтобы клиент был постоянно перенаправлен Apache, чтобы они получили URL-адрес http://foo.example.com/( что угодно) в своем браузере. Если он поступил изнутри из mod_rewrite, я хочу, чтобы запрос обрабатывался веб-фреймворком ... который не знает поддоменов.
Возможно ли что-то подобное?
Кажется, вы почти у цели, не так ли?
Используйте RewriteCond на основе REMOTE_ADDR, например:
#
# Provide HTTP redirect "[R]" for network-external requests
# For permanent redirects, use [R=301], but note cache concerns:
# http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/
#
RewriteCond %{REMOTE_ADDR} !^10\.2\.
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{REQUEST_URI} ^/foo/.*$ [NC]
RewriteRule ^/foo/(.*)$ http://foo.example.com/$1 [R]
#
# Pass-Through "[PT]" to subpath URL for subdomain requests
# (Assumes that foo.example.com/foo would serve the same
# content as example.com/foo, if not for the above rule)
#
RewriteCond %{HTTP_HOST} ^foo\.example\.com [NC]
RewriteRule ^/(.*)$ /foo/$1 [PT]
Пример использования совпадения в REMOTE_ADDR с адресами 10.2.x.x взят из http://httpd.apache.org/docs/2.2/rewrite/intro.html
Я подозреваю, что вам нужно использовать «PT» из-за наличия псевдонима где-то еще в вашей конфигурации. Или непрямой VirtualHost DocumentRoot.
Во всяком случае, это похоже на трюк в моем тестировании:
<VirtualHost _default_:80>
DocumentRoot /var/www/html
RewriteEngine on
RewriteCond %{HTTP_HOST} ^foo\.localhost [NC]
RewriteCond %{REQUEST_URI} ^/foo/.*$ [NC]
RewriteRule ^/foo/(.*)$ /$1 [R]
RewriteCond %{HTTP_HOST} ^foo\.localhost [NC] # <---
RewriteCond %{REQUEST_URI} !^/foo/.*$ [NC] # AND is implicit with above
RewriteRule ^/(.*)$ /foo/index.php?q=$1 [PT]
</VirtualHost>
Со следующим выводом:
$ curl -D - foo.localhost / index.php
HTTP/1.1 200 OK
Date: Wed, 06 Nov 2013 13:46:45 GMT
Server: Apache/2.2.17 (Fedora)
Vary: Host
X-Powered-By: PHP/5.3.6
Content-Length: 55
Connection: close
Content-Type: text/html; charset=UTF-8
Host: foo.localhost
URI: /index.php
Query: q=index.php
$ curl -D - foo.localhost / foo / index.php
HTTP/1.1 302 Found
Date: Wed, 06 Nov 2013 13:46:51 GMT
Server: Apache/2.2.17 (Fedora)
Location: http://foo.localhost/index.php
Content-Length: 293
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://foo.localhost/index.php">here</a>.</p>
<hr>
<address>Apache/2.2.17 (Fedora) Server at foo.localhost Port 80</address>
</body></html>
$ curl -D - foo.localhost / что-нибудь
HTTP/1.1 200 OK
Date: Wed, 06 Nov 2013 13:46:59 GMT
Server: Apache/2.2.17 (Fedora)
Vary: Host
X-Powered-By: PHP/5.3.6
Content-Length: 53
Connection: close
Content-Type: text/html; charset=UTF-8
Host: foo.localhost
URI: /anything
Query: q=anything
$ curl -D - foo.localhost / foo / что-нибудь
HTTP/1.1 302 Found
Date: Wed, 06 Nov 2013 13:47:04 GMT
Server: Apache/2.2.17 (Fedora)
Location: http://foo.localhost/anything
Content-Length: 292
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://foo.localhost/anything">here</a>.</p>
<hr>
<address>Apache/2.2.17 (Fedora) Server at foo.localhost Port 80</address>
</body></html>