Тонкая проблема. Я схожу с ума - PullRequest
4 голосов
/ 10 января 2010

Я хочу, чтобы мой основной домен размещался в подкаталоге (несколько выполнил этот шаг), т.е. когда кто-то вводит www.example.com/news за кулисами, он переходит на www.example.com/subdirectory/. новости, но все равно будут отображаться как www.example.com/news.

Для этого я использовал следующий код bluehost:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/subdirectory/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdirectory/$1

RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ subdirectory/index.php [L]

Этот код работает, если я ввожу www.example.com/news/ (обратите внимание на косую черту), но НЕ работает, если я просто набираю www.example.com/news (без косой черты). Есть идеи почему?

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Я думаю, что проблема в том, что после того, как Apache переписывает / news в / subdirectory / news, он находит запрос, соответствующий каталогу в файловой системе, который НЕ заканчивается косой чертой. Таким образом, он создает редирект на новый URL, включая косую черту.

Дело в том, что на самом деле мы хотим, чтобы добавлялась наклонная черта для сохранения канонического URL (в противном случае мы получим / news и / news /, ведущие в одно и то же место - не очень хорошо для относительных ссылок, SEO и т. Д.) Просто не совсем так, как это делает Apache. Поэтому мы должны сделать это сами, добавив следующее:

RewriteCond %{REQUEST_URI} ^/subdirectory/.*[^/]$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^subdirectory/(.*)$ /$1/ [L,R=301]

Условия этого правила будут соответствовать любым запросам, которые начинаются с «подкаталога», НЕ совпадают с каталогом на fielsysem, но НЕ заканчиваются косой чертой. (например, «/ подкаталог / новости»). Затем rewriterule выдает постоянное перенаправление на тот же путь, но заканчивается косой чертой и удаляет «subdiretcory» (например, «/news/').

».

Затем клиент выдаст запрос на «/ news /», apache перезапишет его в / subdirectory / news / и не будет выполнять перенаправление, потому что оно заканчивается косой чертой.

Быстро проверил это, и, кажется, это сработало.

0 голосов
/ 18 февраля 2010

andrewmabbott прав, и чтобы исправить это, вам нужно использовать ProxyPassReverse . Это перезапишет все перенаправления, чтобы использовать правильный адрес.

Самый простой способ сделать это будет что-то вроде:

ProxyPassReverse /subdirectory http://www.example.com/

Однако bluehost мог отключить mod_proxy, в этом случае это не будет работать.

0 голосов
/ 11 января 2010

Не совсем ответ на ваш вопрос, но не будет ли проще

  • Измените DocumentRoot на общедоступный каталог, или, если вы не можете этого сделать (например, на общем хосте) ...
  • Поместите общедоступные файлы в корневой каталог вашего документа (public_html или как он там называется) и файлы приложения где-нибудь за его пределами (или, если вы не можете подняться выше корневого элемента документа, внутри него, но защищены от веб-доступа с помощью Deny from all
...