Мой корень документа /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 в контейнере докеров.
@MrWhite, пытаюсь отправить запрос с бессонницей и получаю Error: Server returned nothing (no headers, no data)
Это не похоже на проблему с правилом, которое вы опубликовали. Вы должны по крайней мере получить какой-то ответ (ответ 5xx "ошибка" - если есть ошибка). Что произойдет, если полностью удалить файл .htaccess
?
Вы уверены, что у вас не происходит цикл перенаправления? Обычно вы устанавливали правила !-f
(не файл) и !-d
(не каталог) RewriteCond
, а не только определенные расширения файлов...
@MrWhite, спасибо за комментарий. Оказывается, я испортил монтирование тома в контейнере докеров для .htaccess. Однако могу ли я узнать, как можно улучшить мой .htaccess
?
@ CD001, спасибо за ваш комментарий. Это связано с тем, что у меня есть файлы .js и .jpeg, к которым клиент должен получить доступ, поскольку я также использую тот же каталог для страницы пользовательского интерфейса swagger. Или у вас есть идея получше?
@ CD001 Проверки файловой системы !-f
и !-d
часто используются слишком часто. Всегда предпочтительнее использовать сравнение регулярного выражения/строки вместо (или также), если это возможно. (Проверка каталога требуется редко, если, конечно, вам не нужен прямой доступ к каталогам.) Однако здесь все еще есть ненужный «цикл», поскольку запрос дважды перезаписывается в src/index.php
(src/index.php
перезаписывается сам в себя).
Используйте следующий код в .htaccess. Я ожидаю, что это должно работать
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php?page=$1 [QSA,L]
Как это, как ожидается, решит проблему? Это, конечно, не «исправит» ответ, который, похоже, получает ОП. OP не упоминает о необходимости параметра URL?
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]
Большое спасибо. Я действительно все усложняю. Ваш ответ имеет больше смысла.
"сервер не отвечает" - что именно вы имеете в виду? В противном случае ваш
.htaccess
выглядит «ОК» (его можно улучшить, но это не должно приводить к полному провалу).