#php #apache #docker #mod-rewrite #containers
#php #apache #docker #мод-перезапись #контейнеры
Вопрос:
Основная проблема:
http://localhost/mysite/source/aphpfile.php
работает.
http://localhost/mysite/aphpfile
не работает, несмотря на запуск правила перезаписи aphpfile.php
.
Я пробовал с сервером, размещенным в контейнерах, запускаемых из php:7.2-apache
и php:7.4-apache
из изображений контейнеров docker.io/library/
. У меня была одна и та же проблема в обоих. Когда я пытаюсь локально, RewriteRule работает отлично. Я хочу, чтобы он работал в контейнере.
Структура папок на диске (внутри контейнера):
/var/www/html/mysite/source/aphpfile.php
.htaccess
Файлы не включены.
Конфигурация:
- Неизмененный
/etc/apache2/apache.conf
файл. a2enmod rewrite
a2ensite mysite.conf
a2enmod info
При http://localhost/server-info
загрузке подтверждается правильная конфигурация:
Current Configuration: (from server-info page)
In file: /etc/apache2/sites-enabled/mysite.conf
1: <Directory "var/www/html/mysite/">
7: RewriteEngine On
9: RewriteCond %{REQUEST_FILENAME} !-d
10: RewriteCond %{REQUEST_FILENAME} !-f
11: RewriteRule ^aphpfile /var/www/html/mysite/source/aphpfile.php [L]
: </Directory>
Также файл /etc/apache2/sites-enabled/mysite.conf
:
<Directory "var/www/html/mysite/">
Options Indexes
AllowOverride All
Order allow,deny
Allow from all
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^aphpfile /var/www/html/mysite/source/aphpfile.php [L] # <---- this line works in non-container server despite starting with /var/...
#to be sure, I tried also with ^/aphpfile ^mysite/aphpfile
# ^/mysite/aphpfile in additional lines seperately to point
# to /var/www/html/mysite/source/aphpfile.php [L]
# edit1, include exact lines I tried
# RewriteRule ^aphpfile /var/www/html/mysite/source/aphpfile.php [L] # <---- this line works in non-container server despite starting with /var/...
# RewriteRule ^aphpfile source/aphpfile.php [L] # <---- this I tried today after comment from @Daniel Farrell but no change in the result
# RewriteRule ^/aphpfile /var/www/html/mysite/source/aphpfile.php [L]
# RewriteRule ^source/aphpfile /var/www/html/mysite/source/aphpfile.php [L]
# RewriteRule ^/aphpfile /var/www/html/mysite/source/aphpfile.php [L]
</Directory>
Журналы:
/var/log/apache2/access.log
:
127.0.0.1 - - [31/Oct/2020:14:01:36 0000] "GET /mysite/aphpfile HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
/var/log/apache2/error.log
: не показывает ошибку, связанную с этим конкретным
запросом.
Дополнительные сведения:
- Использование
podman
(не docker) podman exec -it <containername> bash
для доступа / изменения контейнера.- Позаботился о перезапуске
apache2
службы, проверке сайта и мод включен.
edit2
Не решение проблемы, но я перехожу к альтернативе:
Таким образом, работает вся функциональность вместе с правилом перезаписи.
Создан новый образ:
#Dockerfile
FROM debian:buster-slim
RUN apt update -y
amp;amp; apt install -y apache2 php php-<many extensions>
amp;amp; apt clean all
#COPY <source> <dest>
#RUN <a2enmod, a2ensite>
CMD apachectl -D FOREGROUND
Все еще не знаю, почему официальные php:7.x-apache
изображения не работают. (Ошибка?)
Комментарии:
1. «#чтобы быть уверенным, я пробовал также с ^/aphpfile ^mysite/aphpfile ^/mysite/aphpfile » Вы на что-то там.
^aphpfile
не соответствует/mysite/aphpfile
. Я хотел бы увидеть примеры, которые не работали в выводе информации о сервере, прежде чем я просто предположил, что вы сделали это правильно. Когда я предполагаю, я пропускаю допустимые точки данных, которые могут обеспечить точность моего анализа. 😛2. Другой момент,
RewriteRule
перезаписывается в местоположение URI, а не в путь к базовой файловой системе. Так что, вероятно, если бы у вас было записано регулярное выражение правильно, вы бы записали URL буквальноhttps://servername/var/www/html/mysite/source/aphpfile.php
, который затем попытался бы прочитать из docroot, что-то вроде /var/www/html/var/www/html/mysite/source/aphpfile.php `, что действительно было бы 404-м номером.3. @Daniel Farrell, спасибо за комментарии, отредактировал исходное сообщение, чтобы включить точные строки, которые я пробовал. Пожалуйста, найдите термин edit1 в сообщении. Потому
mysite.conf
что имеет,<Directory "var/www/html/mysite/">
, я ищу^aphpfile
, который корректно работает на неконтейнерном сервере. Кроме того, вместо этого, если записано<Directory "var/www/html/">
, поиск^mysite/aphpfile
работает на сервере, не являющемся контейнером, и целью которого является абсолютный путь к файлу (начинающийся с /var/…). Ни один из них не работает, когда сервер является контейнером.