Как перенаправить все запросы к файлу PHP внутри подкаталога в apache2?

Мой корень документа /var/www/html/.

Я создал каталог с именем myapi внутри, например /var/www/html/myapi.

Структура папок в /var/www/html/myapi похожа на

.
|-- .htaccess
|-- composer.json
|-- composer.lock
|-- src
|   |-- config
|   |-- index.php
`-- vendor

Я хочу, чтобы все запросы, такие как http:localhost/myapi/books, были перенаправлены на index.php внутри папки src.

моя текущая настройка .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]

RewriteEngine уже включен. Но это не работает и сервер не отвечает.

Могу я узнать как?

Обновлено: ИСПРАВЛЕНО. Я испортил монтирование тома для файла .htaccess в контейнере докеров.

"сервер не отвечает" - что именно вы имеете в виду? В противном случае ваш .htaccess выглядит «ОК» (его можно улучшить, но это не должно приводить к полному провалу).

MrWhite 05.04.2022 13:05

@MrWhite, пытаюсь отправить запрос с бессонницей и получаю Error: Server returned nothing (no headers, no data)

ikhvjs 05.04.2022 13:06

Это не похоже на проблему с правилом, которое вы опубликовали. Вы должны по крайней мере получить какой-то ответ (ответ 5xx "ошибка" - если есть ошибка). Что произойдет, если полностью удалить файл .htaccess?

MrWhite 05.04.2022 13:10

Вы уверены, что у вас не происходит цикл перенаправления? Обычно вы устанавливали правила !-f (не файл) и !-d (не каталог) RewriteCond, а не только определенные расширения файлов...

CD001 05.04.2022 13:21

@MrWhite, спасибо за комментарий. Оказывается, я испортил монтирование тома в контейнере докеров для .htaccess. Однако могу ли я узнать, как можно улучшить мой .htaccess?

ikhvjs 05.04.2022 13:57

@ CD001, спасибо за ваш комментарий. Это связано с тем, что у меня есть файлы .js и .jpeg, к которым клиент должен получить доступ, поскольку я также использую тот же каталог для страницы пользовательского интерфейса swagger. Или у вас есть идея получше?

ikhvjs 05.04.2022 14:01

@ CD001 Проверки файловой системы !-f и !-d часто используются слишком часто. Всегда предпочтительнее использовать сравнение регулярного выражения/строки вместо (или также), если это возможно. (Проверка каталога требуется редко, если, конечно, вам не нужен прямой доступ к каталогам.) Однако здесь все еще есть ненужный «цикл», поскольку запрос дважды перезаписывается в src/index.php (src/index.php перезаписывается сам в себя).

MrWhite 05.04.2022 15:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте следующий код в .htaccess. Я ожидаю, что это должно работать

RewriteEngine On
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php?page=$1 [QSA,L]

Как это, как ожидается, решит проблему? Это, конечно, не «исправит» ответ, который, похоже, получает ОП. OP не упоминает о необходимости параметра URL?

MrWhite 05.04.2022 13:55
Ответ принят как подходящий
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]

...may I know how my .htaccess could be improved?

Как я уже упоминал в комментариях, это «ОК», но его можно улучшить.

Это правило излишне перезаписывает само себя. Здесь нет цикла перезаписи, поскольку вы перезаписываете статический путь к файлу. (Но включите префикс косой черты в строку замена, и вы получите внутреннюю ошибку сервера цикла перезаписи — 500.)

Нет необходимости захватывать весь URL-путь (т.е. (.*)), так как он не используется.

состояние, который проверяет, что запрос не заканчивается известным расширением файла, может быть перемещен в RewriteRuleшаблон. (Директива RewriteCond не требуется.) Удалите точку из чередования регулярных выражений, чтобы «упростить» регулярное выражение. Рассмотрите возможность добавления .php в список известных расширений файлов и/или используйте флаг END (Apache 2.4) вместо L, чтобы предотвратить дальнейшие циклы в механизме перезаписи.

Флаг QSA не требуется, так как вы не добавляете строку запроса к строке замена. Строка запроса передается по умолчанию.

Например, вместо этого используйте следующее:

RewriteRule !\.(png|jpe?g|gif|zip|css|svg|js)$ src/index.php [END]

Большое спасибо. Я действительно все усложняю. Ваш ответ имеет больше смысла.

ikhvjs 05.04.2022 15:08

Другие вопросы по теме