2012-02-09 2 views
0

Моя проблема в том, что RewriteRule по-прежнему подходит, когда я посещаю физический каталог, например. http://a-domain.com/foo/ где foo является обычным каталогом в корневом каталоге веб-сайта.RewriteCond, чтобы пропустить фактические каталоги, кажется, игнорируется

файл .htaccess имеет:

Options -Indexes 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule .? index.php [L] 

Он отлично работает на моем Dev сервере, а не на реальном сервере WHM/CPanel. Я немного потерян.

+0

Включен ли mod_rewrite на вашем общем хостинге? – ThinkingMonkey

+0

Да, и это не общий. – Walf

ответ

0

Я тестировал это на своем веб-сайте cpanel, и вы правы, и я выяснил, в чем проблема. когда вы пытаетесь получить доступ к папке на своем веб-сайте, у которой нет файла (index) по умолчанию, он пытается получить доступ к файлу, который отвечает за 403 HTTP-код, а поскольку этого не существует, он переписывает URL-адрес на index.php.

Все, что вам нужно сделать, это добавить это выше вашего файла .htaccess:

ErrorDocument 403 /index.php?type=err&code=403 
+0

Я пошел с «Параметры -Indexes» и «ErrorDocument 403/index.php», так как избегаю изменять параметры запроса в '.htaccess'. Это позволило получить доступ к желаемой вложенной папке при передаче папок без внесения разрешений на php. – Walf

+0

Ты был самым близким. Код был 401! (поясняется в моем ответе) – Walf

+0

мой сервер генерирует код статуса 403, поэтому я поставил 403 в своем ответе. – undone

0

Я попробовал это на VM which mirrors my own shared service и она отлично работает для меня. У вас есть еще .htaccess в каталоге foo? Если это так, то механизм перезаписи будет игнорировать ваш в DOCROOT и вместо этого использовать это?

+0

Да, но в нем нет директив 'mod_rewrite'. – Walf

+0

Я полагаю, что ваши (две) системные/vhost configs имеют разные директивы DirectoryIndex. Если у вас есть индекс каталога, который включает index.php, тогда правило работает, но/foo/затем отображается на /foo/index.php, поэтому кажется, что правило стреляет – TerryE

+0

Я не трогаю vhost или системные конфиги, поэтому что бы это значило, если они разные? Будет действовать только тот, который имеет наивысший приоритет. Существует директива DirectoryIndex, и она должна соответствовать /foo/index.php, которая существует, но тогда почему мое правило будет соответствовать? У этого есть условия, поэтому он не будет соответствовать реальному dir/file/symlink. – Walf

0

Директория /foo/ имеет базовую аутентификацию, так что она не срабатывала, когда %{REQUEST_FILENAME} содержал несуществующий файл /home/the_user/public_html/401.shtml. Я не думал, что это проблема, потому что базовая проверка подлинности работала, и когда я отменил приглашение auth, мне подавали стандартный файл 401. Обычно, когда эти файлы ErrorDocument отсутствуют, Apache говорит Кроме того, при попытке использовать ErrorDocument для обработки запроса была обнаружена ошибка типа 404.

Смежные вопросы