Перенаправлять все запросы на index.php файл в общей папке

#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]