【发布时间】: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