Apache 2.4 + PHP-FPM ProxyPassMatch htaccess 已处理,但在"internal 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 unknownn'
[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]

所以,重写似乎有效,但是内部重定向后发生了什么?为什么 ProxyPassmatch 忽略了此重写?我错过了什么吗?

提前感谢!

编辑:VHost:

<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是整个匹配字符串。

在这两种情况下,规则优先级都得到了很好的确定。

相关内容

最新更新