Как я могу сделать это с Apache переписывает?(измените URL, если он не содержит 1 из 2 строк) - PullRequest
0 голосов
/ 20 июля 2011

Я установил файл .htaccess, содержащий правила перезаписи (как предложено CodeIgniter), показанные ниже.

Как я могу добавить к нему, чтобы любые запросы на URL, которые не начинаются с members/ или admin/ get public/, помещаются в начале?

т.е. если кто-то запрашивает контакт /, он на самом деле должен идти на public/contact и так далее, если только он не запрашивает members/something или admin/something.


.htaccess в настоящее время:

RewriteBase /

# Removes access to the system folder by users.
RewriteCond %{REQUEST_URI} ^_system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

# prevent user access to the application folder
RewriteCond %{REQUEST_URI} ^myapp.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

# This snippet re-routes everything through index.php, unless
# it's being sent to resources, or searching for robots.text
# Add any OR's in here if you need other directly accessable Files/folders 
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteRule ^(.*)$ index.php/$1  



.htaccess - отредактировано - вот как это выглядит сейчас:

RewriteCond %{REQUEST_URI} ^_system.*
RewriteRule ^(.*)$ /index.php?/$1

RewriteCond %{REQUEST_URI} ^myapp.*
RewriteRule ^(.*)$ /index.php?/$1 

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteRule ^(.*)$ index.php/$1      

RewriteCond %{REQUEST_URI} !^/(members/|admin/|public/|index\.php) [NC]
RewriteRule ^(.*)$ /public/$1 [L]    

Сейчас возвращается 404 для всех запросов. Я уверен, что у меня что-то не так, но не знаю что:)

Структура файла:

site_root / .htaccess site_root / index.php site_root / MyApp /

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

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

Здесь есть ряд проблем, но есть одна большая проблема, которую необходимо решить, прежде чем даже есть смысл решать мелкие проблемы.Похоже, что вы используете платформу, которая работает путем маршрутизации всего (за несколькими исключениями) через index.php (который, безусловно, имеет собственный внутренний маршрутизатор для контроллеров приложений в myapp / ).Но вы также говорите, что хотите маршрутизировать все (за исключением) через public / .

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

  • Какую структуру вы используете?
  • Что такое public / ?Это каталог (если так, что он должен держать)?Или что-то, что должно быть направлено и обработано приложением?
  • Работают ли ваши текущие admin и члены разделы, перейдя в admin / и members / подкаталоги?Или они направляются и обрабатываются приложением?
  • Есть ли у вас какие-либо другие важные сведения о структуре приложения?
0 голосов
/ 20 июля 2011

Вы можете добавить к регулярному выражению !, что означает «не должно совпадать».Таким образом, вы можете достичь того, что вы хотите, как это:

RewriteCond %{REQUEST_URI} !^(public|members|admin)/ [NC]
RewriteRule ^(.*)$ /public/$1 [L]
...