docker中的Apache重写不适用于PHP文件
我的docker容器apache似乎无法重写对docker中的Apache重写不适用于PHP文件,docker,apache,.htaccess,mod-rewrite,url-rewriting,Docker,Apache,.htaccess,Mod Rewrite,Url Rewriting,我的docker容器apache似乎无法重写对.php文件的请求。有趣的是,任何其他文件类型似乎都可以正常工作 例如,使用此简单的.htaccess配置: RewriteEngine On RewriteBase / RewriteRule ^(.*)\.php$ index.php [L] RewriteRule ^(.*)\.html$ index.php [L] RewriteRule ^(.*)\.txt$ index.php [L] RewriteRule ^(.*)\.xml
.php
文件的请求。有趣的是,任何其他文件类型似乎都可以正常工作
例如,使用此简单的.htaccess
配置:
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)\.php$ index.php [L]
RewriteRule ^(.*)\.html$ index.php [L]
RewriteRule ^(.*)\.txt$ index.php [L]
RewriteRule ^(.*)\.xml$ index.php [L]
每个以.php
、.html
、.txt
或.xml
结尾的请求都应重写为index.php
。但是,所有以.php
结尾的请求都将被忽略,并显示请求的文件,就好像根本没有配置一样
Dockerfile:
ARG APACHE_VERSION=""
FROM httpd:${APACHE_VERSION:+${APACHE_VERSION}-}alpine
RUN apk update; \
apk upgrade;
# Copy apache vhost file to proxy php requests to php-fpm container
COPY project.apache.conf /usr/local/apache2/conf/demo.apache.conf
RUN echo "Include /usr/local/apache2/conf/demo.apache.conf" \
>> /usr/local/apache2/conf/httpd.conf
.env(配置)
撰写.yml
version: "3.2"
services:
apache:
build:
context: './apache/'
args:
APACHE_VERSION: ${APACHE_VERSION}
depends_on:
- php
- mysql
networks:
- frontend
- backend
ports:
- "80:80"
volumes:
- ${PROJECT_ROOT}/:/var/www/html/
container_name: apache
Apache配置:
ServerName localhost
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
# Proxy .php requests to port 9000 of the php-fpm container
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
DocumentRoot /var/www/html/
<Directory /var/www/html/>
DirectoryIndex index.php
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Send apache logs to stdout and stderr
CustomLog /proc/self/fd/1 common
ErrorLog /proc/self/fd/2
</VirtualHost>
ServerName本地主机
LoadModule deflate_module/usr/local/apache2/modules/module_deflate.so
LoadModule proxy_module/usr/local/apache2/modules/mod_proxy.so
LoadModule proxy\u fcgi\u module/usr/local/apache2/modules/mod\u proxy\u fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so
#php请求php fpm容器的端口9000
ProxyPassMatch^/(.\.php(/.*)$fcgi://php:9000/var/www/html/$1
DocumentRoot/var/www/html/
DirectoryIndex.php
选项索引跟随符号链接
允许超越所有
要求所有授权
#将apache日志发送到stdout和stderr
CustomLog/proc/self/fd/1通用
ErrorLog/proc/self/fd/2
我不确定问题是否在docker或apache内部,因此可能需要重命名该问题
如果有人想在自己的docker中重现问题,我将使用完整的docker配置:
它有一个用于自动设置的.bat文件,因此您只需运行一个正在工作的docker即可。您有以下
ProxyPassMatch
行:
ProxyPassMatch^/(.\.php(/.*)$fcgi://php:9000/var/www/html/$1
它将每个*.php
请求代理到php fpm
容器的9000
此指令在mod_rewrite
之前运行,并处理所有*.php
文件,因此您在.htaccess
中重写所有*.php
URI的重写规则永远不会被调用
您可以将此指令更改为仅代理/index.php
,并让所有剩余的.php
请求通过mod_rewrite
和.htaccess
,如下所示
ProxyPassMatch^/(index\.php(/.*)$fcgi://php:9000/var/www/html/$1
您可以像这样重构.htaccess:
重新编写引擎打开
重写基/
重写规则^index\.php$-[L,NC]
重写规则\(php | html?| xml)$index.php[NC,L]
.htaccess已启用,当我将规则放在VirtualHost中时,会得到相同的结果。使用.htaccess对我来说更方便。我将规则放在节中,并将它们从.htaccess中删除,得到了完全相同的结果。我用指向整个配置的链接更新了问题,因此任何人都可以复制该问题。我能够使用提供的docker包重新创建安装程序。你的规则也很有效。当我访问http://localhost/abcd123.html
它显示了index.php
中的内容,显示的消息为index.php
。感谢您查看此内容,但是没有其他方法可以解决此问题吗?如果我想更改另一个项目的.htaccess
文件,该怎么办?还是做出更复杂的改变?这听起来像是一个真正的非通用解决方案。我不能以不同的方式执行php代码吗?或者让代理在重写之后发生?代理将在重写之前发生,但您必须完全停止使用php fpm
ServerName localhost
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
# Proxy .php requests to port 9000 of the php-fpm container
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
DocumentRoot /var/www/html/
<Directory /var/www/html/>
DirectoryIndex index.php
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Send apache logs to stdout and stderr
CustomLog /proc/self/fd/1 common
ErrorLog /proc/self/fd/2
</VirtualHost>