#php #apache #.htaccess #redirect #mod-rewrite
#php #apache #.htaccess #перенаправление #мод-перезапись
Вопрос:
Я сталкиваюсь с проблемой при перенаправлении всех запросов на index.php файл, который помещается в общую папку.
Name_of_app
|-app
| |--controllers/
|-config/
| |--db.config
|-public/
| |--js/
| |--css/
| |--index.php
| |--.htaccess
|-vendor/
|-.htaccess
|-composer.json
Есть два файла .htaccess ,
Сначала идет файл Name_of_app / .htaccess , он должен перенаправить весь трафик в Name_of_app / общую папку
RewriteEngine On
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]
Второй — файл Name_of_app/public/.htaccess, который перенаправляет весь трафик на /public/index.php файл
RewriteEngine On
# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
Проблемы:
1. Я не могу получить доступ /public/index.php файл с URL-адреса www.name_of_app.com / .
2. www.name_of_app.com/index.php шоу /public/index.php страница не найдена ошибка
Помогите мне в решении этой проблемы.Спасибо.
Комментарии:
1. Почему вы хотите разделить этот набор правил на два отдельных файла? Это только усложняет задачу и еще больше замедляет работу http-сервера. Интегрируйте правила.
2. С такой структурой каталогов я бы установил
DOCROOT
public
значение «папка», чтобы быть честным.3. Что вы на самом деле подразумеваете под «я не могу получить доступ»? Будьте точны . «показывает … ошибка не найдена страница» означает, что именно ? _ Где отображается эта ошибка?
4. @arkascha url www.name _of_app/ показывает «Запрошенный URL-адрес / общедоступный / не был найден на этом сервере».
5. Извините, но я действительно сомневаюсь в этом. Это означало бы, что детали внутреннего процесса перезаписи доступны извне, что маловероятно. У меня сложилось впечатление, что ваша проблема в реальном мире на самом деле выглядит иначе, чем то, что вы публикуете здесь.
Ответ №1:
Удалить /public/.htaccess
. В /.htaccess
поместите это:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!public/(?:index.php)?$) public/index.php [L]
Затем ваше PHP-приложение должно выполнить синтаксический $_SERVER['REQUEST_URI']
анализ, чтобы увидеть URL-адрес в том виде, в каком он был отправлен. Используйте любой запрос внутри него, чтобы перезаписать содержимое $_GET
, а затем восстановить $_REQUEST
с $_GET
этого момента $_POST
. Простой способ выглядит так:
$url_path = explode($_SERVER['REQUEST_URI'], '?', 2);
if (isset($url_path[1])) {
parse_str($url_path[1], $_GET);
}
else {
$_GET = [];
}
$url_path = (string) substr($url_path[0], 1);// ignore leading '/'
Возможно, вам это не понадобится RewriteBase
.
Ответ №2:
Попробуйте следующий код для Name_of_app/public/.htaccess
DirectoryIndex index.php
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
RedirectMatch 302 ^/$ /index.php/
</IfModule>
</IfModule>
Комментарии:
1. «Запрошенный URL-адрес / общедоступный / не найден на этом сервере». ошибка при доступе к localhost / name_of_app/
2. Какие результаты при использовании таким образом, для Name_of_app /.htaccess
RewriteEngine On RewriteCond %{REQUEST_URI} !public/ RewriteRule (.*) /public/index.php$1 [L]