2016-02-03 3 views
1

Я хочу, чтобы файлы были доступны, когда они доступны, как указано в строке DirectoryIndex. Например. когда кто-то набирается на www.mywebsite.com/mydir/, он будет перенаправлять правильно. Для этого у меня в .htaccess строку:В .htaccess для приоритета DirectoryIndex в RewriteRule

DirectoryIndex index.html default.php 

Если имя файла или каталога не существует, я хочу, чтобы это перенаправить в файл (target_handler.php), который находится в том же каталоге, что и мой .htaccess файл. Для этого я поместил несколько линий после DirectoryIndex:

RewriteEngine On 
RewriteCond %{ENV:URI} ^$ 
RewriteRule ^(.*)$ - [ENV=URI:$1] 

RewriteCond %{ENV:BASE} ^$ 
RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$ 
RewriteRule^- [ENV=BASE:%2] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ %{ENV:BASE}target_handler.php [L,QSA] 

То, что я хочу, чтобы Apache сначала проверить, есть ли index.html или default.php доступны, и только при неготовности выполнить перезапись. В настоящее время поведение кажется случайным (?), Поэтому, если кто-то набирает www.mywebsite.com/mydir/, то Apache иногда переписывает сначала, не проверяя, есть ли index.html в указанной папке.

Помощь оценили

PS: Я тестирование с помощью: XAMPP Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.6.15

+0

Это не будет работать, потому что 'DirectoryIndex' не является частью' mod_rewrite' он использует 'mod_dir', вы не можете иметь его проверить то, если не использовать свои правила перезаписи. Apache не работает таким образом. DirectoryIndex делает то, что он должен. Вам необходимо использовать условия перезаписи, чтобы проверить наличие этих файлов. –

+0

Спасибо за ваш комментарий. Каким образом я могу применить такие условия, чтобы иметь возможность проверить index.html или default.php? – user2022678

+0

@ user2022678: Это .htaccess в корне сайта или в подкаталоге? – anubhava

ответ

0

Вы можете опустить DirectoryIndex и сделать все это с помощью mod_rewrite себя:

RewriteEngine On 

RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$ 
RewriteRule ^(.*)$ - [E=BASE:%1] 

RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}index\.html -f 
RewriteRule^index.html [L] 

RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}default\.php -f 
RewriteRule^default.php [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^target_handler\.php$ target_handler.php [L,NC] 
+0

Спасибо за код. Теперь он, похоже, попал в бесконечный цикл (панель url пытается получить доступ к файлам в цикле) – user2022678

+0

Он будет зацикливаться, только если 'target_handler.php' также не существует вместе с обработчиками по умолчанию. Проверьте обновленный ответ. – anubhava

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