Я новичок в mod_rewrite. Моя проблема: у меня есть два противоречащих друг другу правила.
В моем корне документа у меня был только один .htaccess, перенаправляющий все входящие запросы на сценарий fast-cgi, например:
RewriteRule ^(.*)$ fcgi-bin/python-script.fcgi/$1 [QSA,L]
Теперь у меня есть папка с php-скриптами в корне моего документа, назовем ее «specialdir». Как я могу перенаправить запросы от www.mydomain.com/special
на php specialfolder
а остальные запросы все еще отправляются сценарию fcgi?
Я попытался
RewriteRule ^special$ specialfolder/$1 [QSA,L]
Но запрос, очевидно, все еще обрабатывается моим "поймать все" ^(.*)$
директива.
Должен ли я включать какое-то условие? Как бы это должно было выглядеть?
РЕДАКТИРОВАТЬ: Мой полный файл .htaccess
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
AuthType Basic
AuthName "login"
AuthUserFile /var/www/v/htuser
Require valid-user
#php rewrite
RewriteRule ^special/(.*) specialfolder/$1 [QSA,L]
#trac rewrite
RewriteRule ^trac(.*)$ fcgi-bin/trac-proj/$1 [QSA,L]
#django rewrite
RewriteRule ^(.*)$ fcgi-bin/django/$1 [QSA,L]
RewriteRule ^media/(.*)$ fcgi-bin/django/media/$1 [QSA,L]
Правила перезаписи применяются в том порядке, в котором они перечислены в файле .htaccess. Если вы переместите второе правило выше первого, оно будет иметь приоритет.
Однако у второго правила есть другие проблемы. Путем "завершения" вашего регулярного выражения с помощью ^
и $
вы будете только соответствовать special
именно, special/
не будет совпадать и не будет special/foobar
.
Также запасная часть содержит $1
который будет заменен тем, что было найдено в круглых скобках. Поскольку в вашем шаблоне нет скобок, $1
в замене сбивает с толку.
Вероятно, вам нужно следующее:
RewriteRule ^special/(.*) specialfolder/$1 [QSA,L]
И убедитесь, что это выше упомянутой ранее перезаписи в файле.