PHP Slim 3 .htaccess и index.php не работают в подкаталоге

У меня есть простой проект PHP Slim 3. Все работает нормально, когда .htaccess и index.php находятся в корневом каталоге, но я хочу оставить их в подкаталоге «public». Когда они у меня есть, я получаю ошибку 404. Это не обязательно, но я хочу сохранить все в структуре и знать, что вызывает ошибку или как ее исправить для использования в будущем.

Структура проекта

root
 app
  controllers
 bootstrap
 logs
 public
  css
  js
 resources
 vendor

.htaccess

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

index.php

<?php
// Require application bootstrap
require __DIR__ . '/../bootstrap/app.php';

// Run Slim
$app->run();

Примечание: проект находится на удаленном сервере, работающем на Apache.


person Tomeister    schedule 18.12.2017    source источник
comment
Ваш Apache VirtualHost также должен указывать на public, а не на root.   -  person erikvimz    schedule 18.12.2017
comment
Я бы попробовал ваше решение, но боюсь, что не смогу, поскольку удаленный сервер, который я арендую, не дает мне доступа к редактированию конфигураций Apache   -  person Tomeister    schedule 18.12.2017
comment
Планы хостинга обычно предусматривают аналогичную структуру каталогов. У них есть выделенные папки private и public.   -  person erikvimz    schedule 18.12.2017
comment
Возможный дубликат общедоступного каталога для .htaccess   -  person erikvimz    schedule 18.12.2017
comment
Вы пробовали этот фронт-контроллер? gist.github.com/odan/   -  person odan    schedule 18.12.2017
comment
github.com/slimphp/Slim/issues/2294#issuecomment-341887867   -  person odan    schedule 18.12.2017
comment
@DanielO. передний контроллер вроде работает. Можно ли иметь в проекте более одного файла .htaccess?   -  person Tomeister    schedule 18.12.2017
comment
@Tomeister Если вы запускаете свое Slim-приложение с Apache в подкаталоге, тогда да :-) Прочтите также раздел Контейнеры этого руководства.   -  person odan    schedule 18.12.2017


Ответы (1)


на основе вашего файла .htaccess должно быть примерно так

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

добавление общедоступного перенаправляет его в общую папку и для index.php

index.php

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

<?php
// Require application bootstrap
require dirname(__DIR__). '/bootstrap/app.php';

// Run Slim
$app->run()

надеюсь, это поможет

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

Вы можете помочь решить эту проблему безопасности, если у вас есть доступ к вашему файлу Virtual apache conf, вы можете просто указать свой documentRoot на свой общедоступный файл и поместить свой предыдущий файл .htaccess в общую папку вместе с index.php, но на этот раз ваш .htaccess использует вашу предыдущую конфигурацию

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

когда у вас нет доступа, скажем, на общем хостинге с cpanel просто поместите ваш файл index.php и .htaccess в свой public_html, а остальные файлы приложения и папку отложите в сторону необходимых, которые должны быть в public_html папка, такая как ваши css, js и изображения.

Надеюсь, это было намного полезнее

person Ezekiel    schedule 18.12.2017
comment
Ваш ответ вызывает озабоченность по поводу безопасности. Файлы за пределами public по-прежнему доступны. public папка существует не просто так. - person erikvimz; 18.12.2017
comment
Согласен, просто пытался дать человеку решение текущей ситуации, я не планирую дополнительно усложнять для человека вещи, и я не хочу предполагать, что этот человек обладает обширными знаниями. но я сообщу человеку о тенденциях безопасности - person Ezekiel; 18.12.2017
comment
@Ezekiel - Всегда лучше решать любые проблемы с безопасностью в ответах. В противном случае OP может подумать, что все в порядке, и продолжить создание небезопасных приложений. Давайте поможем друг другу создавать лучшие и безопасные приложения. :-) - person Magnus Eriksson; 18.12.2017
comment
@MagnusEriksson Большое спасибо, я принял это к сведению, сразу же сообщу человеку об этом, а также о возможном способе решения таких проблем. - person Ezekiel; 18.12.2017
comment
@Eric Я немного растерялся, так как не вижу, где эти проблемы безопасности в этом ответе: / - person Tomeister; 18.12.2017
comment
Правило RewriteCond %{REQUEST_FILENAME} !-f означает, что оно будет отслеживать физические файлы внутри root папки, что является проблемой безопасности. - person erikvimz; 18.12.2017
comment
Проблема безопасности, если вы планируете скрыть папки своего приложения, и если человек имеет представление о структуре вашего приложения, но, тем не менее, использует то, что лучше всего подходит для вашей работы. Я надеюсь, что этот вопрос и ответ также помогут другим - person Ezekiel; 18.12.2017
comment
RewriteRule ^ public/index.php [QSA,L] работает, но если это проблема безопасности, я мог бы придерживаться метода фронт-контроллера, предложенного Дэниелом О. Спасибо за помощь - person Tomeister; 18.12.2017
comment
@Tomeister рад, что это было полезно.Обратите внимание, это всего лишь повод для страха, поскольку это обычно сводится к тому, как вы хотите, чтобы ваше приложение работало, например, в случаях, когда у вас уже есть основное приложение или это демонстрация ( demo), поэтому в таком случае безопасность не обязательно будет иметь первостепенное значение, я желаю вам всего наилучшего - person Ezekiel; 19.12.2017