regex - 与 Apache 的 ProxyPassMatch 一起使用时,%0 不会被服务器名称替换

标签 regex apache virtualhost proxypass

问题:

与 ProxyPassMatch 一起使用时,%0 不会被服务器名称(即 test.local)替换。

<VirtualHost *:80>

  UseCanonicalName Off

  # %0 is replaced by server name (works)
  VirtualDocumentRoot /Users/mattes/sites/%0

  # %0 is replaced by an empty string (problem!)
  ProxyPassMatch ^(/.*\.php)$ fcgi://127.0.0.1:9000/Users/mattes/sites/%0/$1

</VirtualHost>

解决方法:

我在这里找到了一篇有趣的博文:http://holtstrom.com/michael/blog/post/225/Apache-2.2-Proxy.html .基本上,Michael 使用 RewriteEngine 来保存变量以供以后使用。像这样的事情会起作用,例如:
<VirtualHost *:80>

  UseCanonicalName Off
  VirtualDocumentRoot /Users/mattes/sites/%0

  RewriteEngine On
  RewriteRule .* - [E=SERVER_NAME:%{SERVER_NAME}]
  ProxyPassInterpolateEnv On
  ProxyPassMatch ^(/.*\.php)$ fcgi://127.0.0.1:9000/Users/mattes/sites/ \
                                                    ${SERVER_NAME}$1 interpolate

</VirtualHost>

虽然它有效,但我认为这是一个不太好的解决方法。我还收到诸如“AH00111:未定义配置变量 ${SERVER_NAME}”之类的错误。

有没有人知道如何解决这个问题?

最佳答案

我在 Apache 2.4 中使用此配置:

<VirtualHost *:8080>
    UseCanonicalName Off
    VirtualDocumentRoot "/usr/local/apache/vhosts/%0"

    RewriteEngine On
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:19054/usr/local/apache/vhosts/%{SERVER_NAME}/$1 [P]
</VirtualHost>
vhosts directory 包含具有 Apache 将动态匹配每个请求的域名的目录。然后匹配所有 PHP 文件,并将它们的请求转发到 PHP FPM 进程监听 127.0.0.1:19054 .

此配置适用于在虚拟主机目录中定义的进一步重写规则。

关于regex - 与 Apache 的 ProxyPassMatch 一起使用时,%0 不会被服务器名称替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18191546/

相关文章:

c# - 检查字符串的一部分是否匹配正则表达式

regex - Bash 正则表达式捕获

python - python 中负向后视的奇怪行为

apache - Logstash 日期过滤器不使用 Apache 时间戳更新 @timestamp

apache - mod_proxy 与 apache tomcat,我该如何设置?

nginx - 错误 28105#0 : *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

regex - 使用 sed 和正则表达式从文件中删除文本

java - Apache CXF 无法发送消息

java - Tomcat 上的虚拟主机

mysql - Cpanel 上的 Express/NodeJS 应用程序