【问题标题】:Cannot get mod_rewrite to work in docker container无法让 mod_rewrite 在 docker 容器中工作
【发布时间】:2021-03-20 16:18:20
【问题描述】:

我正在将一个 PHP 站点移动到 docker,我正在使用 docker-compose。我无法让 mod_rewrite 在 docker 中工作,尽管它在我从中移动它的服务器上运行良好。

我想隐藏 URL 中的文件名和参数,它们是在 .htaccess 文件中定义的。

示例: 我想将 http://mysite/index.php?p1=login 转换为 http://mysite/login

我在 Stackoverflow 和其他地方尝试了多篇文章。

请在下面找到完整的源代码。

docker-compose.yml

version: "3"
services:
    www:
        container_name: www
        build: .
        restart: always
        ports: 
            - "80:80"
            - "443:443"
        volumes:
            - ./public_html/:/var/www/html
            - ./php.ini:/usr/local/etc/php/conf.d/30-custom.ini
        links:
            - db
        networks:
            - default
    db:
      container_name: db
      image: mysql:5.7
      restart: always
      environment:
          MYSQL_ROOT_PASSWORD: a1234
          MYSQL_DATABASE: test
          MYSQL_USER: test
          MYSQL_PASSWORD: a1234
      ports:
          - "3306:3306"
      volumes:
          - ./dump:/docker-entrypoint-initdb.d
          - persistent:/var/lib/mysql
      networks:
          - default
    phpmyadmin:
        container_name: phpmyadmin
        image: phpmyadmin/phpmyadmin
        restart: always
        links: 
            - db:db
        ports:
            - 8080:80
        environment:
            MYSQL_USER: user
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test
volumes:
    persistent:

Dockerfile

FROM php:7.4-apache

# Install stuff
RUN apt-get update && apt-get upgrade -y
RUN apt-get install sudo unzip wget -y
RUN docker-php-ext-install mysqli

# Configure stuff
COPY ./n2.nothing.com.conf /etc/apache2/sites-available/n2.nothing.com.conf
RUN ln -s /etc/apache2/sites-available/n2.nothing.com.conf /etc/apache2/sites-enabled/n2.nothing.com.conf
#RUN chmod -R 755 /var/www
#RUN chown -R www-data:www-data /var/www
RUN a2enmod rewrite
RUN a2enmod ssl
RUN service apache2 restart

EXPOSE 80

n2.nothing.com.conf

  <VirtualHost *:80>
    <Directory /var/www/html>
      Options Indexes FollowSymLinks
        Allow From All
        RewriteEngine On
      
        RewriteRule ^signup\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=signup&p2=$1&p3=$2 [L]
        RewriteRule ^signup\/([^\/]+)\/?  ./index.php?p1=signup&p2=$1 [L]
        RewriteRule ^signup/?$ ./index.php?p1=signup [L,NC,QSA]
        RewriteRule ^verify\/([^\/]+)\/?  ./index.php?p1=verify&p2=$1 [L]
        RewriteRule ^login\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=login&p2=$1&p3=$2 [L]
        RewriteRule ^login\/([^\/]+)\/?  ./index.php?p1=login&p2=$1 [L]
        RewriteRule ^login/?$ ./index.php?p1=login [L,NC,QSA]
        RewriteRule ^logout/?$ ./app/logout/ [L,NC,QSA]
        RewriteRule ^cart/?$ ./index.php?p1=cart [L,NC,QSA]
        RewriteRule ^checkout/?$ ./index.php?p1=checkout [L,NC,QSA]
        RewriteRule ^payment/?$ ./index.php?p1=payment [L,NC,QSA]
        RewriteRule ^account\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=account&p2=$1&p3=$2 [L]
        RewriteRule ^account\/([^\/]+)\/?  ./index.php?p1=account&p2=$1 [L]
        RewriteRule ^account/?$ ./index.php?p1=account [L,NC,QSA]
        RewriteRule ^fapi\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=fapi&p2=$1&p3=$2&ui=0 [L]
        RewriteRule ^fapi\/([^\/]+)\/?  ./index.php?p1=fapi&p2=$1&ui=0 [L]
        RewriteRule ^fapi/?$ ./index.php?p1=fapi&ui=0 [L,NC,QSA]
        RewriteRule ^admin/?$ ./index.php?p1=admin [L,NC,QSA]
        RewriteRule ^designer\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=designer&p2=$1&p3=$2 [L]
        RewriteRule ^designer\/([^\/]+)\/?  ./index.php?p1=designer&p2=$1 [L]
        RewriteRule ^designer/?$ ./index.php?p1=designer [L,NC,QSA]
        RewriteRule ^product\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=product&p2=$1&p3=$2 [L]
        RewriteRule ^product\/([^\/]+)\/?  ./index.php?p1=product&p2=$1 [L]
        RewriteRule ^product/?$ ./index.php?p1=product [L,NC,QSA]
        RewriteRule ^checkout/?$ ./index.php?p1=checkout [L,NC,QSA]
        RewriteRule ^contact\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=contact&p2=$1&p3=$2 [L]
        RewriteRule ^contact\/([^\/]+)\/?  ./index.php?p1=contact&p2=$1 [L]
        RewriteRule ^contact/?$ ./index.php?p1=contact [L,NC,QSA]
        RewriteRule ^cron/?$ ./index.php?p1=cron [L,NC,QSA]
        RewriteRule ^terms/?$ ./index.php?p1=terms [L,NC,QSA]
        RewriteRule ^privacy/?$ ./index.php?p1=privacy [L,NC,QSA]
    </Directory>

    ServerAdmin me@nothing.com
    ServerName nothing.com
    ServerAlias n2.nothing.com
    
    DocumentRoot /var/www/html
    ErrorLog /var/www/error.log
    CustomLog /var/www/access.log combined
  </VirtualHost>
  
ServerSignature Off
ServerName n2.nothing.com

php.ini (php.ini文件中没有内容)


自述文件

# 1 - First I build
sudo docker-compose build --no-cache

# 2 - Then I run docker-compose
sudo docker-compose up -d

# 3 - I log into the www container to look for errors in the /var/www/error.log file
docker exec -it www /bin/bash
# 1 - First I build
sudo docker-compose build --no-cache

# 2 - Then I run docker-compose
sudo docker-compose up -d

# 3 - I log into the www container to look for errors in the /var/www/error.log file
docker exec -it www /bin/bash

.htaccess

RewriteEngine On
RewriteRule ^signup\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=signup&p2=$1&p3=$2 [L]
RewriteRule ^signup\/([^\/]+)\/?  ./index.php?p1=signup&p2=$1 [L]
RewriteRule ^signup/?$ ./index.php?p1=signup [L,NC,QSA]
RewriteRule ^verify\/([^\/]+)\/?  ./index.php?p1=verify&p2=$1 [L]
RewriteRule ^login\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=login&p2=$1&p3=$2 [L]
RewriteRule ^login\/([^\/]+)\/?  ./index.php?p1=login&p2=$1 [L]
RewriteRule ^login/?$ ./index.php?p1=login [L,NC,QSA]
RewriteRule ^logout/?$ ./app/logout/ [L,NC,QSA]
RewriteRule ^cart/?$ ./index.php?p1=cart [L,NC,QSA]
RewriteRule ^checkout/?$ ./index.php?p1=checkout [L,NC,QSA]
RewriteRule ^payment/?$ ./index.php?p1=payment [L,NC,QSA]
RewriteRule ^account\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=account&p2=$1&p3=$2 [L]
RewriteRule ^account\/([^\/]+)\/?  ./index.php?p1=account&p2=$1 [L]
RewriteRule ^account/?$ ./index.php?p1=account [L,NC,QSA]
RewriteRule ^fapi\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=fapi&p2=$1&p3=$2&ui=0 [L]
RewriteRule ^fapi\/([^\/]+)\/?  ./index.php?p1=fapi&p2=$1&ui=0 [L]
RewriteRule ^fapi/?$ ./index.php?p1=fapi&ui=0 [L,NC,QSA]
RewriteRule ^admin/?$ ./index.php?p1=admin [L,NC,QSA]
RewriteRule ^designer\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=designer&p2=$1&p3=$2 [L]
RewriteRule ^designer\/([^\/]+)\/?  ./index.php?p1=designer&p2=$1 [L]
RewriteRule ^designer/?$ ./index.php?p1=designer [L,NC,QSA]
RewriteRule ^product\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=product&p2=$1&p3=$2 [L]
RewriteRule ^product\/([^\/]+)\/?  ./index.php?p1=product&p2=$1 [L]
RewriteRule ^product/?$ ./index.php?p1=product [L,NC,QSA]
RewriteRule ^checkout/?$ ./index.php?p1=checkout [L,NC,QSA]
RewriteRule ^contact\/([^\/]+)\/([^\/]+)\/?  ./index.php?p1=contact&p2=$1&p3=$2 [L]
RewriteRule ^contact\/([^\/]+)\/?  ./index.php?p1=contact&p2=$1 [L]
RewriteRule ^contact/?$ ./index.php?p1=contact [L,NC,QSA]
RewriteRule ^cron/?$ ./index.php?p1=cron [L,NC,QSA]
RewriteRule ^terms/?$ ./index.php?p1=terms [L,NC,QSA]
RewriteRule ^privacy/?$ ./index.php?p1=privacy [L,NC,QSA]

来源: public_html/index.php

<?php
  session_start();

  $p1 = "";   if(isset($_GET['p1'])) { $p1 = $_GET['p1']; }
  $p2 = "";   if(isset($_GET['p2'])) { $p2 = $_GET['p2']; }
  $p3 = "";   if(isset($_GET['p3'])) { $p3 = $_GET['p3']; }
  $ui = 1;    if(isset($_GET['ui'])) { $ui = $_GET['ui']; }
  $mode = ""; if(isset($_GET['mode'])) { $mode = $_GET['mode']; }

  echo "p1: '" . $p1 . "'<br />\n";
  echo "p2: '" . $p2 . "'<br />\n";
  echo "p3: '" . $p3 . "'<br />\n";
  echo "ui: '" . $ui . "'<br />\n";
  echo "p4: '" . $mode . "'<br />\n";
  
  echo "<hr>\n";
  
  echo "<p><a href='./login'>test ./login</a></p> should load ./index.php?p1=login\n";
?>

【问题讨论】:

  • 您确定您的 .htaccess 也会在容器中结束吗?你能在这里发布.htaccess 文件吗?看起来这是使此问题描述可测试的最后一个文件。
  • 嗨,BertC。感谢您的回复 :-) 我已将 .htaccess 文件添加到这篇文章中。我认为 .htaccess 文件已添加到容器中,因为当我在文件的顶部和底部添加 时,会出现内部服务器错误,但 / 中没有记录任何内容var/www/error.log 文件。当我在文件中写一些像“fafasfasfas”这样的乱码时也会发生同样的情况,它会给出一个内部服务器错误,这也表明 .htaccess 文件实际上已加载。
  • 这几乎就像我对 RewriteRule 行的配置与我用来测试它的 URL 不匹配。这很奇怪,因为。这个确切的例子正在我正在将代码移开的 webhotel 上工作所以配置中的某个地方存在一些问题,但我还没有找到。

标签: php docker apache mod-rewrite docker-compose


【解决方案1】:

我找到了解决此问题的方法。

从 .htaccess 中移动所有内容,然后删除 .htaccess 文件。然后将内容移动到 n2.nothing.com.conf 文件中。

示例中的 n2.nothing.com.conf 文件已更新。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多