Apache2 RewriteRule не работает в контейнере изображения docker.io/library/php:7.4-apache

#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 Файлы не включены.

Конфигурация:

  1. Неизмененный /etc/apache2/apache.conf файл.
  2. a2enmod rewrite
  3. a2ensite mysite.conf
  4. 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>
  

Журналы:

  1. /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"
  
  1. /var/log/apache2/error.log : не показывает ошибку, связанную с этим конкретным
    запросом.

Дополнительные сведения:

  1. Использование podman (не docker)
  2. podman exec -it <containername> bash для доступа / изменения контейнера.
  3. Позаботился о перезапуске 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/…). Ни один из них не работает, когда сервер является контейнером.