mod_rewrite, чтобы служить подкаталогом docroot как поддомен - PullRequest
1 голос
/ 14 февраля 2012

Я пытаюсь использовать mod_rewrite для перенаправления запросов на 123.example.com/456/file.html на example.com/123/456/file.html. Переписать необходимо, потому что новые каталоги могут быть созданы на лету. Я пытался объяснить это, но, похоже, не могу прийти к рабочему решению.

Во-первых, если я воспользуюсь приведенными ниже правилами перезаписи, я получу 404 для всего , потому что оно успешно выполняет второе правило, выполняет внутреннее перенаправление, снова выполняет правила и первое правило совпадает, потому что оно выглядит за 123/123/456/file.html, в результате чего 404.

RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-f
RewriteRule (.*) - [R=404,L]

RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f
RewriteRule (.*) /%1/$1 [L]

Если я переместу 404 на последнее место, я получу следующее:

RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f
RewriteRule (.*) /%1/$1 [L]

RewriteCond %{DOCUMENT_ROOT}/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/$1 !-f
RewriteRule ^(.*)$ - [R=404,L]

Он почти работает так, как мне нужно, но не работает 404, когда вы вводите 123.example.com/123/, хотя он должен быть недействительным. Поскольку путь не был переписан по первому правилу, $1 оценивается как 123/ вместо неверного пути 123/123/, что делает запрос успешным без выполнения каких-либо правил перезаписи.

Мне кажется, я очень близок к тому, чтобы заставить это работать. Любая помощь приветствуется.

1 Ответ

1 голос
/ 14 февраля 2012

Добавьте следующий RewriteCond перед первым набором правил, как показано ниже, чтобы предотвратить внутреннее перенаправление

#prevent internal redirects
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-f
RewriteRule (.*) - [R=404,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...