.htaccess для подпапки - PullRequest
       3

.htaccess для подпапки

3 голосов
/ 10 января 2012

У меня следующая структура

-www
  \-subfolder

В www У меня есть основной сайт index.php.

В подпапке у меня есть своего рода интерфейс администратора, и там яЯ хотел бы иметь еще index.php для интерфейса администратора.

В настоящее время мои запросы из /subfolder/index.php перенаправляются на www/index.php, и в основном страницы моего интерфейса администратора не отображаются.

Это мой .htaccess файл:

RewriteEngine On
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]

Вы можете мне помочь?Я пробовал несколько вариантов в других ответах, но, поскольку я не настолько продвинут, как веб-разработчик, я не смог заставить их работать.


@ TerryE, Извините, если я выдал себя за грубую.

Я использую локальную настройку для тестирования.Я установил сервер Vertrigo, который дает мне сервер Apache. Работает на ОС Windows7.Сервер установлен в папке Program files \ VertrigoServ \ Apache.

Моя общая папка - www.Там у меня есть мое основное определение сайта.,Доступ к сайту осуществляется локально через 127.0.0.1/index.php или 127.0.0.1/

У меня есть локализация сайта, поэтому URL создаются как /$lang/$page например <a href=" / <?php echo $lang; ?> / home "> HOME </a>

В index.php основного сайта у меня естьследующее:

$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );

$lang = trim( ( isset( $_GET[ 'lang' ] ) ? $_GET[ 'lang' ] : 'en' ), '/' );
$langs = array( 'en', 'fr', 'ru' ); 

И по этим данным я могу открыть страницы следующим образом:

include 'html/'. $lang . '/' . $page . '.php';

Все страницы моего основного сайта лежат в www/html/$lang/

$_SERVER['REQUEST_URI']) дает /en/home для страницы HOME.

127.0.0.1/en/home РАБОТАЕТ

Вся навигация отлично работает для основного сайта.

Однако я создал интерфейс администратора, которыйлежит в папке www / admin - на один уровень ниже в www.

И там у меня нет никакой локализации.У меня просто есть EN как язык.Итак, в верхней части index.php в папке администратора у меня снова

$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );

Однако здесь навигация выглядит следующим образом <a href=/admin/home"> HOME </a>

, и после этого я получаю построить страницы вindex.php в папке администратора выглядит следующим образом:

include 'html/ . $page . '.php';

страницы лежат в www/admin/html

Это не работает вообще.Всякий раз, когда я нажимаю домашнюю ссылку в интерфейсе администратора, меня перенаправляют на мой основной сайт (несуществующую страницу).Если я добавлю RewriteRule ^subfolder/ - [L] в .htaccess, я получу HTTP 404 NOT Found error.

127.0.0.1/admin/home НЕ РАБОТАЕТ.Также нет никакой другой навигации изнутри администратора.Спасибо за вашу готовность и терпение, чтобы помочь мне!

Ответы [ 3 ]

9 голосов
/ 11 января 2012

Я предполагаю из этого, что у вас есть только один .htaccess файл в вашем каталоге www .

Подумайте о том, что правило

RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]

делает при интерпретации в контексте Perdir из www : возьмите любой URI формы someDir/somePage и замените его на index.php?lang=someDir&page=somePage, так что это будет перехватывать и перезаписывать любые /subfolder/index.php.

Это недостаточно хорошо документировано, но при обработке Perdir предпочтительнее использовать самый низкий .htaccess параметр файла RewriteEngine On в пути запроса.Таким образом, если вы добавите специфичный для администратора файл .htaccess в подпапку «подпапка», это будет вытеснять www единицу и обойдёт эту проблему.

Postscript comments

Вени и другие постеры получают ответы на вопросы и ответы, когда реальная проблема заключается в том, «как я отлаживаю свои правила .htaccess, если мой сайт размещен на общем сервисе?»Причина, по которой я добавляю квалификацию общего сервиса, заключается в том, что если у вас есть root-доступ к вашей конфигурации LAMP, вы можете включить ведение журнала перезаписи, а файл журнала на уровне отладки 4-6 даст вам достаточно криминалистических данных, чтобы понять, что происходит..

Однако подавляющее большинство пользователей хобби / небольших сервисов покупают свои услуги на общих основаниях, и здесь у них нет корневого доступа, и хостинг-провайдер отключает такую ​​регистрацию по соображениям производительности, поэтому у них есть двоичная обратная связь- правила работают или нет.Я использую общую службу, и мой подход (описанный здесь ) состоит в том, чтобы настроить виртуальную машину, которая отражает эту конфигурацию в качестве среды тестирования и интеграции - и в этом у меня есть такой корневой доступ.Однако, это, вероятно, слишком сложно для большинства пользователей.Это действительно более широкая тема, которая заслуживает отдельного обсуждения / обсуждения.

По конкретным вопросам:

  • Если ваша структура /(lang|admin)/page, то почему у вас этоправило, потому что это может вызвать хаос при повторных попытках perdir.

    RewriteRule ^$ index.php [QSA,L]
    
  • Лучше что-то вроде следующего, чтобы принудительно перенаправить на язык по умолчанию (предположим, что список lang в этом примере - EN и IT:

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond $1 !^/(en|it|admin)/
    RewriteRule ^(.*) http://yourdomain/en/$1 [R=301,L]
    
  • Известно ли вам о проблемах перезапуска / циклического переадресации (поиск REDIRECT_STATUS)

Я новичок в Stackoverflow, но не для того, чтобы разобраться с этим типом с ** т. У меня есть пара подробных статей в моем блоге по этому вопросу.

Постскриптумные комментарии - еще больше

ОК, некоторые общиеhelp.

  • Не исправляйте фиксированные IP-адреса, добавьте псевдоним 127.0.0.1 в ваш windows \ system32 \ drivers \ etc \ hosts
  • Вы можете включить ведение журнала перезаписи в VertrigoServ.Конфигурация Apache, и это дает вам подробный аудит, где у вас есть проблемы
  • Также полезно, если у вас есть небольшая диагностическая заглушка, чтобы помочь вам понять, что происходит, и это то, что я придумал для index.php в каталогах тестов:

    <?php header( "Content-type: text.plain" ); echo "main: "; var_export($_GET);
    

Но вам действительно нужно в каждом из следующих случаев: - обрабатывать URI, существующий (и останавливать циклы перезаписи) - значения по умолчанию для / и / admin / - admin / * - * / * - * (и языковые значения по умолчанию)

и вот что я придумал.Я держал это простым.Мы могли бы использовать сложные регулярные выражения, чтобы сложить некоторые из них, но зачем?Вам может понадобиться добавить больше QSA, если это необходимо.

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f                [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .  -                                  [L]

RewriteRule ^$ index.php                          [QSA,L]
RewriteRule ^admin/?$ admin/index.php             [QSA,L]

RewriteRule ^admin/(.*)$ admin/index.php?page=$1  [L]

RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]

RewriteRule ^(.*)$ index.php?lang=en&page=$1      [L]
3 голосов
/ 12 января 2012
RewriteEngine On

RewriteRule ^$ index.php [QSA,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^subfolder/(.*)$ subfolder/index.php?page=$2 [L]

RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
0 голосов
/ 10 января 2012

Вы можете предотвратить переписывание запросов к вашей подпапке, изменив значение ниже

RewriteEngine On
RewriteRule ^$ index.php [QSA,L]

#prevent requests to your subfolder from being rewritten
RewriteCond %{REQUEST_URI} !^/subfolder/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...