Я пытаюсь перенаправить динамическую страницу в каталог, например:
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
Это прекрасно.