Apache mod_rewrite не работает с FastCGI

Я пытаюсь настроить Apache с HHVM. В рамках этого мне нужно настроить правила перезаписи. Я запустил HHVM как демон в режиме FastCGI. Я включил модули Apache mod_proxy, mod_proxy_fcgi и mod_rewrite.

Во-первых, без mod_rewrite у меня есть этот виртуальный хост:

<VirtualHost *:80>
  DocumentRoot /app
  ProxyPass / fcgi://127.0.0.1:9000/app/
</VirtualHost>

У меня есть файл /app/foo.php, который выглядит так:

<?php echo "HELLO\n";

И поэтому я могу получить к нему доступ, используя:

$ curl http://localhost/foo.php
HELLO

Теперь, после настройки моих правил перезаписи:

<VirtualHost *:80>
  DocumentRoot /app
  ProxyPass / fcgi://127.0.0.1:9000/app/

  RewriteEngine on
  RewriteRule ^(.*)$ /foo.php
</VirtualHost>

Я ожидаю, что все запросы теперь приводят к выполнению файла foo.php с выводом HELLO.

Однако происходит то, что мне дается HTTP 403 не только для запросов к /foo.php, но и для любого запроса:

$ curl http://localhost/foo.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /foo.php
on this server.</p>
<hr>
<address>Apache/2.4.6 (Ubuntu) Server at localhost Port 80</address>
</body></html>

$ curl http://localhost/blah
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /blah
on this server.</p>
<hr>
<address>Apache/2.4.6 (Ubuntu) Server at localhost Port 80</address>
</body></html>

Журнал ошибок Apache показывает мне:

$ tail -2 /var/log/apache2/error.log 
[Fri Apr 11 21:30:20.645439 2014] [authz_core:error] [pid 5090:tid 140114499983104] [client 127.0.0.1:39056] AH01630: client denied by server configuration: /app/foo.php
[Fri Apr 11 21:30:23.281610 2014] [authz_core:error] [pid 5090:tid 140114616588032] [client 127.0.0.1:39057] AH01630: client denied by server configuration: /app/foo.php

После этого я установил права доступа к каталогу:

<VirtualHost *:80>
  DocumentRoot /app
  ProxyPass / fcgi://127.0.0.1:9000/app/

  <Directory /app>
    Require all granted
  </Directory>

  RewriteEngine on
  RewriteRule ^(.*)$ /foo.php
</VirtualHost>

И теперь Apache обслуживает простой файл /app/foo.php:

$ curl http://localhost/blah
<?php

echo "HELLO\n";

То есть теперь он, похоже, соблюдает правила перезаписи, но теперь игнорирует правило ProxyPass.

Как мне заставить их работать вместе?


person jameshfisher    schedule 11.04.2014    source источник


Ответы (2)


Вот и понял: используйте ProxyPassMatch и не беспокойтесь о mod_rewrite.

Вот так:

<VirtualHost *:80>
  DocumentRoot /app

  ProxyPassMatch ^.*$ fcgi://127.0.0.1:9000/app/foo.php

  <Directory /app>
    Require all granted
  </Directory>
</VirtualHost>
person jameshfisher    schedule 12.04.2014

У меня была аналогичная проблема, и я не мог позволить себе не использовать mod_rewrite. Оказывается, существует конфликт между mod_geoip и mod_rewrite, если для параметра mod_geoip «GeoIPScanProxyHeaders» установлено значение «Вкл.» Одновременно с включением «mod_remoteip».

«GeoIPScanProxyHeaders» - это настройка для получения IP-адреса клиента для использования «mod_geoip». Оказывается, параметр mod_geoip «GeoIPScanProxyHeaders» не должен быть включен в Apache 2.4, если загружен «mod_remoteip». 'mod_remoteip' должен быть предпочтительным, а 'mod_geoip' будет использовать результаты 'mod_remoteip'.

person chakatz    schedule 22.07.2016