Перенаправить все в индекс.с PHP htaccess файл


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

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

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

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

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

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

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

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

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

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

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

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

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

5 81

5 ответов:

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

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

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

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

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

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


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

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

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


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

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

это упростит RewriteRule немного, как вам не нужно создавать путь:

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 = строка запроса Apend, на всякий случай у вас есть что-то вроде ?like=penguins на конце, который вы хотите сохранить и перейти к индексу.РНР.

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

FallbackResource /index.php

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

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

RewriteEngine on

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

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

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

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

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

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

здесь...

<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-ПЕРЕПИСАТЬ чтобы понять, как это работает, я понял, что все его проверки всегда происходят после проверки, существует ли указанный файл или нет. Только тогда RegEx обрабатываются. Даже когда ваш URI указывает на папку, Apache будет принудительно проверять файлы Index указано в его конфигурационном файле.

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

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

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

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

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

AllowOverride All

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