Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker中的Apache重写不适用于PHP文件_Docker_Apache_.htaccess_Mod Rewrite_Url Rewriting - Fatal编程技术网

docker中的Apache重写不适用于PHP文件

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

我的docker容器apache似乎无法重写对
.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>