Я использую mod_rewrite в файле настроек ManagedFusion (подобный .htaccess), и я хочу передать все входящие запросы к другому порту на сервере, за исключением нескольких папок.
До сих пор у меня есть это (с папкой ui, формами, clientsystem и проигнорированными виджетами)
RewriteEngine On
RewriteCond %{REQUEST_URI} !ui$
RewriteCond %{REQUEST_URI} !forms$
RewriteCond %{REQUEST_URI} !clientsystem$
RewriteCond %{REQUEST_URI} !widgets$
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L]
Это хорошо работает, пока те каталоги исключения не существуют, однако когда они будут созданы, rewriteengine просто инициирует снова, и в этом случае он будет соответствовать правилу, таким образом, передавая мне другому порту, в конце концов.
Как я мог решить это?
Другой вопрос, если я хочу запросы как'? file=bla', чтобы быть переданным также, это будет просто работать как это?
Править: это - то, с чем я закончил:
RewriteCond %{QUERY_STRING} ^(.+)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^ui
RewriteCond $1 !^forms
RewriteCond $1 !^clientsystem
RewriteCond $1 !^widgets
RewriteRule ^/?(.*) http://localhost:8050/$1?%1 [P,L,R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^ui
RewriteCond $1 !^forms
RewriteCond $1 !^clientsystem
RewriteCond $1 !^widgets
RewriteRule ^/?(.*) http://localhost:8050/$1 [P,R]
Некоторое дублирование, но это работает.
Что касается второй части вашего вопроса, сделайте флаги RewriteRule похожими на: [P, L, QSA]
. QSA расшифровывается как Query String Append и сделает очевидное для вашей последней строки до того, как произойдет перенаправление.
Кстати, вы, скорее всего, захотите включить R во флаги, поскольку он действительно перенаправит клиента на новый URL.
Обновление: теперь я понимаю, что вы хотите пропустить эти каталоги в любом случае?
Если это так, тогда вы можете использовать
RewriteCond $1 !^ui
RewriteCond $1 !^forms
...
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L,QSA]
, который просто не будет соответствовать и не перенаправлять пользователя в случае, если запрашиваемый URL начинается с любого заданных строк.
Попробуйте добавить это, чтобы применить правило, только если файл или каталог с таким именем не существует:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Кстати, я считаю эту шпаргалку по mod_rewrite очень удобной: http://dreev.es/modrewrite .