Назад | Перейти на главную страницу

.htaccess rewrite Условие для одного специального каталога, в то время как все остальные запросы проходят через

Я новичок в 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]

И убедитесь, что это выше упомянутой ранее перезаписи в файле.