php - Apache 2.4 + PHP-FPM ProxyPassMatch htaccess 已处理但在 "internal redirect"之后被忽略

标签 php apache .htaccess mod-rewrite redirect

我已经设置了带有 Apache 2.4 和 PHP5-FPM 5.5.9 的 Ubuntu Server 14.04.1。我已经配置了 Apache,将 proxy_fcgi 与 ProxyPassMatch 一起使用:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1

这按预期工作:我访问该页面,内容呈现,一切看起来都很棒。

现在我添加一些内容和 .htaccess,它应该隐藏一个子文件夹(Yii2/web 文件夹):

  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^public
  RewriteRule ^(.*)$ web/$1 [L]

这应该可以完成工作 - 但事实并非如此。因此,我启用了调试日志记录:

[Mon Dec 08 10:49:57.414781 2014] [authz_core:debug] [pid 21794] mod_authz_core.c(802): [client 172.31.51.30:54313] AH01626: authorization result of Require all granted: granted
[Mon Dec 08 10:49:57.415581 2014] [authz_core:debug] [pid 21794] mod_authz_core.c(802): [client 172.31.51.30:54313] AH01626: authorization result of <RequireAny>: granted
[Mon Dec 08 10:49:57.415761 2014] [rewrite:trace3] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] strip per-dir prefix: /var/www/my.url/ ->
[Mon Dec 08 10:49:57.415898 2014] [rewrite:trace3] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] applying pattern '^(.*)$' to uri ''
[Mon Dec 08 10:49:57.416062 2014] [rewrite:trace4] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] RewriteCond: input='/' pattern='!^public' => matched
[Mon Dec 08 10:49:57.416170 2014] [rewrite:trace2] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] rewrite '' -> 'web/'
[Mon Dec 08 10:49:57.416309 2014] [rewrite:trace3] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] add per-dir prefix: web/ -> /var/www/my.url/web/
[Mon Dec 08 10:49:57.416430 2014] [rewrite:trace2] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] strip document_root prefix: /var/www/my.url/web/ -> /web/
[Mon Dec 08 10:49:57.416548 2014] [rewrite:trace1] [pid 21794] mod_rewrite.c(468): [client 172.31.51.30:54313] 172.31.51.30 - - [my.url/sid#7f4b93b491a0][rid#7f4b93a8c0a0/initial] [perdir /var/www/my.url/] internal redirect with /web/ [INTERNAL REDIRECT]
[Mon Dec 08 10:49:57.416730 2014] [authz_core:debug] [pid 21794] mod_authz_core.c(828): [client 172.31.51.30:54313] AH01628: authorization result: granted (no directives)
[Mon Dec 08 10:49:57.416905 2014] [proxy_fcgi:debug] [pid 21794] mod_proxy_fcgi.c(73): [client 172.31.51.30:54313] AH01060: set r->filename to proxy:fcgi://127.0.0.1:9000/var/www/my.url/index.php
[Mon Dec 08 10:49:57.417040 2014] [proxy:debug] [pid 21794] mod_proxy.c(1104): [client 172.31.51.30:54313] AH01143: Running scheme fcgi handler (attempt 0)
[Mon Dec 08 10:49:57.417125 2014] [proxy_fcgi:debug] [pid 21794] mod_proxy_fcgi.c(764): [client 172.31.51.30:54313] AH01076: url: fcgi://127.0.0.1:9000/var/www/my.url/index.php proxyname: (null) proxyport: 0
[Mon Dec 08 10:49:57.417203 2014] [proxy_fcgi:debug] [pid 21794] mod_proxy_fcgi.c(774): [client 172.31.51.30:54313] AH01078: serving URL //127.0.0.1:9000/var/www/my.url/index.php
[Mon Dec 08 10:49:57.417254 2014] [proxy:debug] [pid 21794] proxy_util.c(2020): AH00942: FCGI: has acquired connection for (*)
[Mon Dec 08 10:49:57.417300 2014] [proxy:debug] [pid 21794] proxy_util.c(2072): [client 172.31.51.30:54313] AH00944: connecting //127.0.0.1:9000/var/www/my.url/index.php to 127.0.0.1:9000
[Mon Dec 08 10:49:57.417542 2014] [proxy:debug] [pid 21794] proxy_util.c(2206): [client 172.31.51.30:54313] AH00947: connected /var/www/my.url/index.php to 127.0.0.1:9000
[Mon Dec 08 10:49:57.419240 2014] [proxy_fcgi:error] [pid 21794] [client 172.31.51.30:54313] AH01071: Got error 'Primary script unknown\n'
[Mon Dec 08 10:49:57.419438 2014] [proxy:debug] [pid 21794] proxy_util.c(2035): AH00943: FCGI: has released connection for (*)
[Mon Dec 08 10:49:57.488883 2014] [authz_core:debug] [pid 21794] mod_authz_core.c(802): [client 172.31.51.30:54313] AH01626: authorization result of Require all granted: granted
[Mon Dec 08 10:49:57.489025 2014] [authz_core:debug] [pid 21794] mod_authz_core.c(802): [client 172.31.51.30:54313] AH01626: authorization result of <RequireAny>: granted
[Mon Dec 08 10:49:57.489334 2014] [core:info] [pid 21794] [client 172.31.51.30:54313] AH00128: File does not exist: /var/www/my.url/favicon.ico
[Mon Dec 08 10:49:57.682546 2014] [proxy:debug] [pid 21831] proxy_util.c(1694): AH00925: initializing worker fcgi://127.0.0.1:9000/var/www/my.url/$1 shared
[Mon Dec 08 10:49:57.682753 2014] [proxy:debug] [pid 21831] proxy_util.c(1734): AH00927: initializing worker fcgi://127.0.0.1:9000/var/www/my.url/$1 local
[Mon Dec 08 10:49:57.682819 2014] [proxy:debug] [pid 21831] proxy_util.c(1785): AH00931: initialized single connection worker in child 21831 for (127.0.0.1)

特别是这部分看起来很有趣:

strip per-dir prefix: /var/www/my.url/ ->
applying pattern '^(.*)$' to uri ''
RewriteCond: input='/' pattern='!^public' => matched
rewrite '' -> 'web/'
add per-dir prefix: web/ -> /var/www/my.url/web/
strip document_root prefix: /var/www/my.url/web/ -> /web/
internal redirect with /web/ [INTERNAL REDIRECT]

所以,重写似乎有效,但是 INTERNAL REDIRECT 之后发生了什么?为什么 ProxyPassmatch 会忽略此重写?我错过了什么吗?

提前致谢!

编辑:虚拟主机:

<VirtualHost *:80>
    ServerName      my.url
    ServerAdmin     me@myurl
    DocumentRoot        "/var/www/my.url"
    LogLevel        DEBUG rewrite:trace8
    ErrorLog        ${APACHE_LOG_DIR}/my.url.error.log
    CustomLog       ${APACHE_LOG_DIR}/my.url.log combined

    <Directory "/var/www/my.url">

        Options -Indexes
        Require all granted
        AllowOverride All
    </Directory>

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/my.url/$1
    DirectoryIndex index.php

</VirtualHost>

最佳答案

您遇到的问题是您尝试以交互不确定的方式使用两个单独的 Apache 模块。使用 ProxyPassMatch 或 RewriteRule,但不能同时使用两者。

使用其中之一:

ProxyPassMatch ^/public/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/public/$1
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/web/$1

或者在重写规则中使用[P]标志(代理),以便应用mod_rewrite中的执行顺序规则:

RewriteEngine on

RewriteRule ^(?!public/).*$   web/$0 
RewriteRule ^.*\.php(/.*)?$   fcgi://127.0.0.1:9000/var/www/$0 [P,END]

请注意,$0 是整个匹配字符串。

在这两种情况下,规则优先级都是明确确定的。

关于php - Apache 2.4 + PHP-FPM ProxyPassMatch htaccess 已处理但在 "internal redirect"之后被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355514/

相关文章:

php - 迁移: Cannot declare class X,时发生错误,因为该名称已被使用

java - 在JSP中的Java方法内将文本打印到网页

.htaccess - htaccess 在 vagrant VM/PuPHPet 中无法识别

javascript - 有没有办法在没有 javascript 的情况下在移动应用程序上有一个完整的站点按钮?

php - Zend中如何从外部数据库获取记录?

php - 将 Rails 模型连接到非 Rails 数据库

PHP Search_Array使用通配符

linux - 安装Passenger + Passenger进程未启动

apache - htaccess 重定向查询字符串,但已编码?到 &

javascript 或 htaccess 重写 url