(Предполагая, что вы помещаете правила в файл .htaccess в корне документа), используйте это:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^upload
RewriteRule (.*) site/$1 [L]
Если вы помещаете его в httpd.conf, вам нужно немного его изменить:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/upload
RewriteRule (.*) /site$1 [L]
Что касается второго вопроса, мне лично не нравится mod_rewrite, и я определенно не буду использовать его в качестве постоянного решения, если вам абсолютно не нужно. Это потому, что mod_rewrite довольно неэффективен, особенно на загруженных серверах, потому что он должен выполнять хотя бы одно регулярное выражение для каждого входящего запроса. Вы всегда должны использовать флаг [L]
, чтобы гарантировать, что обработано не больше правил, чем необходимо.
Всегда эффективнее структурировать каталоги так, как приложение ссылается на них. Вышеуказанное должно заставить вас работать, но старайтесь не оставлять его на месте слишком долго.
Я уверен, что вы уже знаете это, но здесь - это документация mod_rewrite.