Перенаправить все в index.php htaccess

Приношу свои извинения за 10000000-й вопрос по этой теме, но я просто не могу заставить его работать так, как я хочу.

Я пишу простой php mvc'ish framework. Я хочу, чтобы этот фреймворк мог быть установлен в любом каталоге.

Что делает мой php-скрипт: Захватывает URI запроса и разбивает его на сегменты. Делаем сегмент 1 контроллером, а сегмент 2 действием. Все идет хорошо, когда я делаю это:

http://www.domain.com/mvc/module/test/

Это перейдет к определенному контроллеру модуля и методу. Теперь у меня есть контроллер по умолчанию, домашний контроллер, который находится в папке home.

Теперь, когда я получаю доступ к этой папке напрямую, http://www.domain.com/mvc/home/ Он будет отображать 403 запрещенных, потому что эта папка существует, вместо этого она также должна вернуться к http: //www.domain. ком /MVC /index.php

Если бы я установил фреймворк в другую папку, допустим, что фреймворк папки нужно перенаправить обратно на http: //www.domain.com/framework/index.php

Я бы хотел перенаправить каждую папку и php-файл обратно в index.php, оставив все остальное таким, как есть.

Первая проблема, с которой я столкнулся, заключалась в том, что она никогда не перенаправляет в нужную папку, всегда в корневую папку домена.

Это то, что я пробовал:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

Я действительно надеюсь, что кто-то может помочь мне или указать мне правильное направление!

Большое спасибо !!

87 голосов | спросил David Ericsson 23 PM00000070000005831 2013, 19:06:58

5 ответов


0

Ваше правило переписывания выглядит почти нормально.

Сначала убедитесь, что ваш файл .htaccess находится в корневом каталоге вашего документа (там же, где index.php) или это повлияет только на подпапку, в которой он находится (и любые подпапки в ней - рекурсивно).

Затем внесите небольшое изменение в правило, чтобы оно выглядело примерно так:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

В данный момент вы просто совпадаете с ., который является одним экземпляром любого символа. нужно по крайней мере .*, чтобы сопоставить любое количество экземпляров любого символа.

Переменная $_GET['path'] будет содержать поддельную структуру каталогов, поэтому /mvc/module/test, например, который затем можно использовать в index.php, чтобы определить контроллер и действия, которые вы хотите выполнить.


Если вы хотите, чтобы весь shebang был установлен в подкаталог, например, /mvc/ или /framework/ наименее сложный способ сделать это - слегка изменить правило перезаписи, чтобы учесть это.

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

И убедитесь, что ваш index.php находится в этой папке, а .htaccess файл находится в корне документа.


Альтернатива $_GET['path'] (обновлено в феврале 18 года)

На самом деле нет необходимости (и даже сейчас не часто) устанавливать путь как переменную $_GET, многие фреймворки будут использовать $_SERVER['REQUEST_URI'] для получения той же информации - обычно, чтобы определить, какой контроллер использовать - но Принцип точно такой же.

Это немного упрощает RewriteRule, поскольку вам не нужно создавать параметр path :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

По-прежнему применяются те же правила установки в подкаталоге, например

.
RewriteRule ^.*$ /mvc/index.php [L,QSA]



Флаги:

NC = Без регистра (без учета регистра, не обязательно, так как в шаблоне нет символов)

L = Last (после этой перезаписи перестанет переписываться, поэтому убедитесь, что это последняя вещь в вашем списке перезаписей)

QSA = Query String Apend, на случай, если у вас что-то вроде ?like=penguins на конце, который вы хотите сохранить и передать в index.php.

ответил CD001 23 PM00000070000000531 2013, 19:35:05
0

Чтобы перенаправить все, что не существует, в index.php, вы также можете использовать FallBackResource директива

FallbackResource /index.php

Он работает так же, как ErrorDocument, когда вы запрашиваете несуществующий путь или файл на сервере, директива молча запрещает запрос к index.php.

Если вы хотите перенаправить все (including existant files or folders) в index.php, вы можете использовать что-то вроде следующего:

RewriteEngine on

RewriteRule ^((?!index\.php).+)$ /index.php [L]

Обратите внимание, что шаблон ^((?!index\.php).+)$ соответствует любому URI, кроме index.php мы исключили путь назначения, чтобы предотвратить ошибку бесконечного зацикливания.

ответил starkeen 28 J0000006Europe/Moscow 2016, 07:24:21
0

Вы можете использовать что-то вроде этого:

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

Это перенаправит каждый запрос в корневой каталог index.php. Обратите внимание, что он также перенаправляет запросы для существующих файлов, таких как изображения, файлы JavaScript или таблицы стилей.

ответил Technoh 23 PM00000070000001431 2013, 19:24:14
0

Для этой проблемы есть один «прием», который подходит для всех сценариев, настолько очевидное решение, что вам придется попробовать его, чтобы поверить, что оно действительно работает…:)

Вот оно ...

<IfModule mod_rewrite.c>

   RewriteEngine On

   RewriteCond %{REQUEST_FILENAME}  -f [OR]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php [L,QSA]

</IfModule>

По сути, вы просите MOD_REWRITE перенаправить на index.php запрос URI всегда, когда файл существует И всегда, когда запрошенный файл не существует !

Исследуя исходный код MOD-REWRITE , чтобы понять, как он работает, я понял, что все его проверки всегда происходят после проверки, существует ли указанный файл или нет. Только после этого RegEx будут обработаны. Даже когда ваш URI указывает на папку, Apache будет принудительно проверять индексные файлы , указанные в его файле конфигурации.

Основываясь на этом простом обнаружении, стало очевидно, что простой проверки файла будет достаточно для всех возможных вызовов , поскольку мы дважды коснемся проверки наличия файла и направим оба результата в один конец. точка, охватывающая 100% возможностей.

ВАЖНО: Обратите внимание, что в index.php нет /. По умолчанию MOD_REWRITE будет использовать папку, установленную в качестве «базовой папки» для пересылки. Прелесть этого в том, что он не обязательно должен быть «корневой папкой» сайта, что позволяет этому решению работать для localhost/ и /или любую подпапку, к которой вы применили.

В конечном счете, некоторые другие решения, которые я тестировал ранее (те, которые, казалось, работали нормально), нарушили способность PHP «требовать» файл через его относительный путь, что является обломом. Будьте осторожны.

Некоторые люди могут сказать, что это не элегантное решение. На самом деле это может быть, но в тестах, в нескольких сценариях, на нескольких серверах, в нескольких разных версиях Apache и т. Д. Это решение работало на 100% во всех случаях!

ответил Julio Marchi 21 AM000000120000003631 2017, 00:40:36
0

Глупый ответ, но если вы не можете понять, почему его не перенаправляют, убедитесь, что для веб-папки включено следующее.

AllowOverride All

Это позволит вам запустить htaccess, который должен быть запущен! (есть альтернативы, но их нет, это вызовет проблемы apache.org/docs/2.4/mod/core.html#allowoverride )

ответил Antony 2 FriEurope/Moscow2016-12-02T18:52:35+03:00Europe/Moscow12bEurope/MoscowFri, 02 Dec 2016 18:52:35 +0300 2016, 18:52:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132