htaccess mod_rewrite перенаправляет на контроллер CodeIgniter вместо подпапки - PullRequest
2 голосов
/ 15 января 2012

Я использую CodeIgniter и добавил некоторые правила в .htaccess для перенаправления всех запросов в index.php / a / b в / a / b Вот эти правила:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

Я хочу отключить список каталогов в apache, поэтому я добавил следующее правило:

Options -Indexes

Проблема в том, что, как только я добавил это правило, оно отключает список каталогов, а также перенаправляет любой вызов в определенную папку (которая не содержит индекс. * файл) в контроллер CodeIgniter (который не существует и генерирует ошибку 404).

До: доступ к папке / X возвращает список каталогов

После: доступ к папке / X автоматически вызывает index.php / X и возвращает ошибку 404.

Я хочу, чтобы любой доступ к / X и любой подпапке в нем просто возвращал ошибку 403 (или любую ошибку, которая не связана с запуском сценария php), а не вызывал index.php / X (я хочу, чтобы пользователи иметь возможность доступа к файлам в / X и его подпапках, но не разрешать пользователям видеть список каталогов / X и его подпапок).

Я пытался, но безуспешно:

  • добавление <Directory "/X"> правила. Похоже, я не могу использовать его в моем .htaccess
  • добавление правила RewriteCond $1 !^(X.*|/X.*) перед RewriteRule ^(.*)$ index.php/$1 [L] (см. Выше). Это не похоже на работу.

Что мне написать в .htaccess для решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 15 января 2012

Чтобы исключить любую папку, начинающуюся с /X, используйте добавленную # 1 ReWriteCond ниже.

Чтобы вернуть 403 для /X и подкаталогов, раскомментируйте две строки, следующие за # 1, ипрокомментируйте строку после # 2.Порядок важен, поэтому это правило должно стоять на первом месте, если вы хотите, чтобы оно работало

RewriteEngine On
RewriteBase /

#1 to return a 403, for /X, uncomment these 2 lines
#RewriteCond %{REQUEST_URI} ^/X [NC]
#RewriteRule . - [L,F]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#2 exclude any folder starting with X
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ /X [NC]
RewriteRule ^(.*)$ index.php/$1 [L]
0 голосов
/ 16 января 2012

Вы не можете использовать <Directory /X> в .htaccess, поскольку .htaccess - это инструкция <Directory>, экспортированная за пределы скомпилированной конфигурации apache и проверяемая во время выполнения для каждого запроса.да .htaccess плох и работает очень медленно, но это также означает, что вы можете удалить все ваши .htaccess и заменить их правильными <Directory> файлами в файлах конфигурации apache, если у вас есть доступ к таким файлам.Теперь твоя проблема.Вы хотите определить прямой доступ к каталогу /X и отправить для этого код ошибки http.Чтобы распространить это правило на все каталоги /foo или /foo/bar, которые не содержат файлов index.php, я бы просто написал:

# detect requested url IS a directory
RewriteCond %{REQUEST_FILENAME} -d
# detect the requested directory does not contain an index.php file
RewriteCond %{REQUEST_FILENAME}index.php !-f
# then bail out
RewriteRule ^(.*)$ - [R=403,L]
...