Apache mod_rewrite RewriteCond для обхода статических ресурсов не работает - PullRequest
1 голос
/ 22 апреля 2010

Я не могу понять, почему этот RewriteCond вызывает каждый запрос для отправки в мое приложение FastCGI, когда оно фактически должно позволить Apache обслуживать статические ресурсы.

Я добавил файл hello.txt в DocumentRoot для демонстрации.

Текстовый файл:

ls /Sites/CioccolataTest.webapp/Contents/Resources/static  
hello.txt

VirtualHost и правила его перезаписи:

AppClass /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest -port 5065
FastCgiExternalServer /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest.fcgi -host 127.0.0.1:5065
<VirtualHost *:80>
    ServerName cioccolata-test.webdev
    DocumentRoot /Sites/CioccolataTest.webapp/Contents/Resources/static

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/(.*)$ /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest.fcgi/$1 [QSA,L]
</VirtualHost>

Даже с параметром -f Apache направляет запросы для этого текстового файла (т. Е. Доступ http://cioccolata -test.webdev / hello.txt возвращает мое приложение, а не текстовый файл).

В качестве подтверждения концепции я изменил RewriteCond на:

RewriteCond %{REQUEST_URI} !^/hello.txt

Это заставило его корректно обслуживать текстовый файл и позволяло каждому другому запросу попадать в приложение FastCGI.

Почему не работает моя оригинальная версия? Мне нужно указать apache, чтобы каждый файл в DocumentRoot служил статическим ресурсом, но если файл не существует, он должен переписать запрос к моему приложению FastCGI.

ПРИМЕЧАНИЕ. Работающее приложение FastCGI имеет значение /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest (без префикса .fcgi) ... Префикс .fcgi используется только для того, чтобы модуль fastcgi направил запрос в приложение.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2010

Я нашел способ заставить его работать, но мне ни разу за все мои 6 лет веб-разработки никогда не приходилось делать это. Я поставил %{DOCUMENT_ROOT} перед REQUEST_FILENAME перед проверкой, является ли это файл.

FastCgiServer /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest -port 5065
<VirtualHost *:80>
    ServerName cioccolata-test.webdev
    DocumentRoot /Sites/CioccolataTest.webapp/Contents/Resources/static

    RewriteEngine On

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteRule ^/(.*)$ /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest [QSA,L]
</VirtualHost>

По какой-то причине он рассматривает все пути как абсолютные пути файловой системы. Обычно apache обрабатывает пути относительно корня документа, не так ли?

Интересно, связано ли это с тем, что на мое приложение fastcgi ссылаются по абсолютному пути (думаю, так и должно быть). Я новичок в мире fastcgi.

1 голос
/ 10 мая 2010

% {REQUEST_FILENAME} недоступно, как и следовало ожидать в контексте VHost, поскольку mod_rewrite подключается к запросу до фазы, которая устанавливает эту переменную.Добавление DOCUMENT_ROOT - хороший способ обойти это.

0 голосов
/ 22 апреля 2010

Я собираюсь предположить, что REQUEST_FILENAME, вероятно, не то, что вы хотите в этом контексте.Увеличьте свой RewriteLogLevel, и он точно скажет вам, почему он делает то, что делает.

...