Переписывание url с htaccess, когда существует каталог

Я пытаюсь перенаправить динамическую страницу в каталог, например:

url.com/index.php?page=download to url.com/download 

Правило очень просто:

 RewriteRule ^download$ /index.php?page=download 

ПОЛНЫЙ .HTACCESS

 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !^www\.url\.com$ RewriteRule ^(.*) http://url.com/$1 [R=301,L] Redirect 301 /index.php?page=download http://url.com/download RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule .* - [L] RewriteRule ^download$ /index.php?page=download 

Проблема в том, что у меня уже есть каталог с именем «загрузка», и он возвращает мне «Запрещенную ошибку 403». Я заметил, что переименование каталога на что-либо, отличное от имени (загрузки) используемого правила, будет работать.

Итак, мой вопрос: как я могу переписать свой url так, как мне нужно, и сохранить каталог?

— РЕДАКТИРОВАТЬ —

Мой сервер по умолчанию защищает каждый каталог с «Ошибка 403 Forbbiden». Я считаю, что это причина, по которой он не работает, но я не уверен. Действительно ли это конфликт? Что происходит?

 /download/?page=download 

Причина, по которой это происходит, заключается в том, что где-то mod_dir перенаправляет все запросы для каталогов, в которых отсутствует конечная косая черта, чтобы включить конечную косую черту. Это мешает вашему правилу перезаписи. Поскольку ваш сервер автоматически настроен на запрет на перечисление каталогов, вероятно, безопасно перейти и отключить слэш каталога:

 DirectorySlash Off 

Ответа на этот вопрос https://stackoverflow.com/users/851273/jon-lin

Ваша проблема, я думаю, из-за этого конкретного правила перезаписи:

  RewriteRule .* - [L] 

Apache будет читать ваш htaccess подробно, по очереди, и попытается сопоставить каждое правило перезаписи по очереди (+ условия, очевидно). Давайте подробно рассмотрим его.

  RewriteCond %{HTTP_HOST} !^www\.url\.com$ RewriteRule ^(.*) http://url.com/$1 [R=301,L] 

Эти два сами по себе НЕ хороши, но не являются источником вашей проблемы. Если HTTP HOST – это что-то вроде http://www.url.com, он перенаправляется на http://url.com/ … который не является http://www.url.com, который затем перенаправляется на url.com. У вас есть потенциальный бесконечный цикл, но только если HTTP HOST не работает с http://www.url.com. Если он соответствует, из-за флага L, он прерывает обработку и возвращает перенаправление.

 Redirect 301 /index.php?page=download http://url.com/download 

Эта линия прекрасна. Вы переадресовываете 301 для всех, кто знает индекс index.php? Page = download.

 RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule .* - [L] 

Эта строка НЕ хороша. Условие перезаписи указывает, что до сих пор все, что не является перенаправлением сверху, будет работать для следующего правила. Следующее правило соответствует ALL (. * Означает все. 0 или более символов чего-либо) и переписывает -, который на языке mod_rewrite не касается флага. Это отлично. Тем не менее, флаг L разбивает цепочку и возвращает ее , что приводит к тому, что ваш файл загрузки / папки будет отображаться в виде списка вашей фактической папки загрузки, которая является источником вашей ошибки 403.

Удалите флаг L, чтобы получить следующее правило для обработки:

 RewriteRule ^download$ /index.php?page=download 

Это прекрасно.