У меня есть 5 производственных серверов, работающих под управлением FreeBSD 9.2, но мы планируем перейти на CentOS. Из-за этого я пытаюсь настроить несколько виртуальных машин для эмуляции нашей среды производственного сервера с использованием CentOS 6.6. Я все настроил, и все работает отлично, за исключением одного правила перезаписи.
<Directory /var/www/html/www/trunk/amapi>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</Directory>
<Directory /var/www/html/www/trunk/amapi/public>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</Directory>
<Directory /var/www/html/www/trunk>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*start\.php
RewriteRule ^start.php/?(.*)$ $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ start.php/$1?%{QUERY_STRING} [L]
</Directory>
Первые два правила перезаписи предназначены для API бэкенда с использованием Phalcon, и они отлично работают в обеих средах. Третье правило перезаписи — это перехват всех запросов, которые не соответствуют реальному файлу, в start.php, который пытается сопоставить их с модулем Phalcon, а затем на страницу 404, если ни один маршрут не сопоставляется.
По какой-то причине он работает под FreeBSD, на которой запущен Apache 2.2.27, но не под CentOS, на которой на данный момент запущен Apache 2.2.15. Это очень простое правило перезаписи, которое должно работать под любой версией Apache без проблем, но Apache продолжает выдавать 404, когда я пытаюсь получить доступ к файлу. Я что-то упускаю? Очевидно, что конфигурация SSL и определенные параметры отсутствуют в отображаемом коде, но это порядок, в котором reqrites появляются в ssl.conf.
Заранее спасибо
Обновление: логи Apache Rewrite:
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (2) init rewrite engine with requested uri /letters/custom/test
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (3) applying pattern '^/attc2/(.*)$' to uri '/letters/custom/test'
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (3) applying pattern '^/forms/(.*)$' to uri '/letters/custom/test'
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (3) applying pattern '^/grafx/(.*)$' to uri '/letters/custom/test'
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (3) applying pattern '^/xport/(.*)$' to uri '/letters/custom/test'
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (3) applying pattern '.*' to uri '/letters/custom/test'
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (4) RewriteCond: input='' pattern='!.*mydomain.com/.*$' [NC] => matched
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (4) RewriteCond: input='/letters/custom/test' pattern='\\.(jpg|gif|png)$' => not-matched
10.1.1.135 - - [24/Feb/2015:17:39:17 --0500] [trunk.mydomain.com/sid#7f18f3072f98][rid#7f18f36099b8/initial] (1) pass through /letters/custom/test
решение1
Интересно, может быть, проблема в неэкранированной точке? Попробуйте заменить эту строку:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*start\.php
С:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\.*start\.php