.htaccess mod_rewrite проблема - PullRequest
0 голосов
/ 23 марта 2010

Почти в любом проекте, над которым я работаю, возникают некоторые проблемы с .htaccess.Обычно я просто нахожу самое простое решение и оставляю его, потому что у меня нет никаких знаний или понимания для Apache, серверов и т. Д. Но на этот раз я подумал, что спрошу вас, ребята.Моя (упрощенная) настройка:

/modrewrite-test
    .htaccess
    /config
    /inc
    /lib
    /public_html
        .htaccess
        /cms
            /navigation
                index.php
                edit.php
            /pages
                index.php
                edit.php
        login.php
        page.php

Папки «config», «inc» и «lib» должны быть «скрыты» от корня сайта.Я пытаюсь сделать это путем создания .htaccess-файла в корне, который перенаправляет пользователя на «public_html»..Htacess-файл содержит это:

RewriteEngine On
RewriteRule   (.*) public_html/$1

Это прекрасно работает.Если я наберу "http://localhost/modrewrite-test/login.php" в моем браузере, я попаду в public_html / login.php, что является моим намерением. Так что это работает нормально. Файл .htaccess в" public_html "содержит это:

RewriteEngine On

# Root
RewriteRule   ^$ page.php [L]

# Login
RewriteRule   ^(admin)|(login)\/?$ login.php [L]

# Page (if not a file/directory)
RewriteCond   %{REQUEST_FILENAME} !-d
RewriteCond   %{REQUEST_FILENAME} !-f
RewriteRule   ^(.*)$ page.php?url=$1 [L]

Первая перезапись просто перенаправляет меня в public_html / page.php, если я пытаюсь достичь "http://localhost/modrewrite-test/". Следующая перезапись только для удобства пользователей, пытающихся войти в систему - поэтому, если они пытаются достичь"http://localhost/modrewrite-test/admin" или "http://localhost/modrewrite-test/login" они окажутся в файле login.php.Третий и последний перезаписывает обрабатывает остальные запросы.Если я попытаюсь достичь "http://localhost/modrewrite-test/bla/bla/bla", он просто перенаправит меня в public_html / page.php (с набором переменных GET 'url') вместо поиска папки с именем" la ", содержащей папку с именем" bla ""и т. д.

Все эти вещи работают идеально, но возникают небольшие проблемы, когда я, например, пытаюсь достичь" http://localhost/modrewrite-test/cms/navigation" без косой черты в конце URL.Когда я пытаюсь добраться до этой страницы, браузер каким-то образом перенаправляется на «http://localhost/modrewrite-test/public_html/cms/navigation/".». Отображается правильная страница, но почему она перенаправляется и добавляет часть «public_html» в URL?нетронутым и что страница public_html / cms / navigation / index.php отображается.

Файлы и папки в (упрощенно) можно найти в http://highbars.com/modrewrite-test.zip

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Я столкнулся с той же проблемой со «странными» перенаправлениями при попытке доступа к существующему каталогу без косой черты в конце.В моем случае это перенаправление было выполнено с помощью mod_dir модуля Apache.Для отключения перенаправления я использовал директиву DirectorySlash .Попробуйте вставить в .htaccess файлы следующую строку:

DirectorySlash Off
0 голосов
/ 28 марта 2010

Добавьте следующее к /modrewrite-test/.htaccess:

RewriteBase /modrewrite-test

Чтобы быть в безопасности, я бы добавил это правило также к /modrewrite-test/public_html/.htaccess.Я обнаружил, что установка RewriteBase всегда предотвращает множество потенциальных проблем в будущем.Это, однако, означает, что вам может потребоваться обновить значения, если вы измените структуру URI вашего сайта.

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

RewriteCond   %{REQUEST_FILENAME} !-d
RewriteCond   %{REQUEST_FILENAME} !-f

Однако, если вы пытаетесь открыть любой индексный файл из существующего подкаталога, выполучить перенаправление на .../public_html/....Поскольку вы можете правильно открыть /modrewrite-test/cms/navigation/edit.php, я могу только предположить, что запрос перезаписывается какой-то основной директивой Apache, которая добавляет косую черту в конце URL-адреса папки.Обратите внимание, что все работает нормально, если у вас есть конечная косая черта в каждом URL-адресе (т. Е. Основной каталог Apache не должен «исправлять» ваш URL-адрес, поэтому все переписывается по вашим собственным правилам перезаписи).

Предлагаемое решение (если никто не может посоветовать лучше):

Измените /modrewrite-test/public_html/.htaccess следующим образом:

RewriteEngine On
RewriteBase /modrewrite-test

# Page (if not a file/directory)
RewriteCond   %{REQUEST_FILENAME} !-d
RewriteCond   %{REQUEST_FILENAME} !-f
RewriteRule   ^(.*)$ page.php?url=$1 [L]

Затем удалите все PHP-файлы из подпапок и используйте шаблон Front Controller , то есть направьте все запросы через ваш основной page.php и не делегируйте ничего ниже.

Затем можно использовать Заводской шаблон для запуска отдельных пользовательских интерфейсов (т. Е. navigation/edit.php) непосредственно из основного файла page.php на основесодержимое $ _GET ['url'] (убедитесь, что правильно его очистили).

Обновление № 2: Этот другой пост в StackOverflow содержит рекомендации по структуре проекта, используемой Zend Framework - в сущности, он демонстрирует подход, который я предложил выше.Это ценный информационный ресурс независимо от того, используете вы Zend Framework или нет.

0 голосов
/ 23 марта 2010

RewriteBase может помочь. Попробуйте это в public_html / .htaccess:

RewriteEngine On
RewriteBase /
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...