2012-02-09 4 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.