Мне нужно создать виртуальные корневые директории для пользователей.
Ну, то есть, переписывать все запросы вида:
example.com<user_name>
на
example.com/user?name=<user_name>
и такой шаблон я таки сообразил как написать:
RewriteRule ^/([A-Za-z0-9_-]+)/?$ /user?name=$1 [PT,L]
но как сделать так, чтобы mod_rewrite не переписывал реально существующие в корне директории?
например /css, /js, /img, да там еще куча скриптов помимо /user имеется
Указывать их всех в шаблоне регулярного выражения, как исключения(что-то в духе: [^css|^js|^img… ]), я не думаю, что правильно, потому что исключений там будет больше дюжины…
UPD: В общем в моём случае, похоже, есть своя специфика…
Apache у меня используется в связке с Tomcat, через mod_jk
mod_jk настроен вот так:
JkMount / ajp13
JkMount /* ajp13
JkUnMount /*.html ajp13
JkUnMount /*.ico ajp13
JkUnMount /css/* ajp13
JkUnMount /img/* ajp13
JkUnMount /js/* ajp13
Поэтому статические файлы которые отдает сам апач(.html, .ico, .css etc) — их можно исключить способом, который уже предложили в первом комменте:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
но запросы к сервлетам mod_rewrite по-прежнему будет переписывать.
Апач не знает, существуют ли они или нет, он их просто отдает на откуп tomcat'у
Поэтому на ряду с правильным поведением:
example.com<user_name> -->
example.com/user?name=<user_name>
будет присутствовать и неправильное:
example.com/login -->
example.com/user?name=login
(login — это servlet)
Как все же можно решить эту проблему?
UPD2: В общем решение оказалось простым:
RewriteCond %{REQUEST_URI} !=/login
RewriteCond %{REQUEST_URI} !=/user
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([A-Za-z0-9_-]+)/?$ /user?name=$1 [PT,L]