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

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

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

Что делает мой скрипт php: захватывает запрос uri и разбивает его на сегменты. Создание сегмента 1 контроллера и сегмента 2 действия. Это нормально, когда я это делаю:

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

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

Теперь, когда я присоединяюсь к этой папке напрямую http://www.domain.com/mvc/home/, она будет отображать 403 запрещенных, потому что эта папка существует, вместо этого она также должна вернуться к http://www.domain.com /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] 

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

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

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

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

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

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

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

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

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

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


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

Флаги:

NC = No Case (не чувствителен к регистру, не является необходимым, так как в шаблоне нет символов)

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

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

Чтобы перенаправить все, что не существует в 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 мы исключили путь назначения для предотвращения ошибки с бесконечным циклом.

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

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

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

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

AllowOverride All

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

Существует одна «трюк» для этой проблемы, которая подходит ко всем сценариям, настолько очевидное решение, что вам придется попробовать, чтобы поверить, что на самом деле это работает … 🙂

Вот…

 <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% во всех случаях!