перенаправить на конкретную страницу, если не войти в систему – .htaccess

Я запускаю apache2 и php5 на моем ПК с Windows.

Я защитил свой каталог, используя .htaccess и .htpasswd . Если информация для входа не установлена ​​или комбинация имени пользователя и пароля неверна, браузер будет запрашивать окно имени пользователя и пароля по умолчанию, если пользователь пытается получить доступ к защищенному директорию. Но я хочу перенаправить пользователя на конкретный адрес или URL-адрес. Короче говоря, я хочу перенаправить пользователя вместо отображения основного диалога проверки подлинности HTTP. Как я могу сделать это возможным?

Спасибо заранее … :)

blasteralfred

Пересмотренный ответ … Я считаю, что вы можете сделать это с помощью mod_rewrite . Вот пример, который я нашел:

 # turn on rewrite engine RewriteEngine on # if authorization header is empty (non-authenticated client) RewriteCond %{HTTP:Authorization} ^$ # redirect to new url RewriteRule /current/path /new/path 

Caveat emptor … Я не могу проверить это на данный момент. Попробуйте попробовать, поместите это в свой .htaccess и измените пути в соответствии с вашей средой.

Вы можете использовать HTTP-аутентификацию в PHP в дополнение к Apache (через .htaccess). Это может дать вам больше контроля.

Из руководства:

 if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); echo 'Text to send if user hits Cancel button'; exit; } else { // do the redirect here? } 

Я получил это, чтобы работать с подходом, похожим на AJ's. Мой файл .htaccess очень похож на следующий:

 AuthUserFile /opt/www/htaccess AuthType Basic DirectoryIndex public.txt <Files "secret.txt"> require valid-user FileETag None Header unset ETag Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT" </Files> <Files "public.txt"> FileETag None Header unset ETag Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT" </Files> RewriteEngine On RewriteBase / RewriteCond %{HTTP:Authorization} !="" RewriteRule ^$ secret.txt [L] 

При этом сайт ведет себя следующим образом:

1) Доступ к базовому URL-адресу -> см. Содержимое из public.txt. 2) Access /secret.txt -> запросил аутентификацию и показал содержимое secret.txt. 3) Еще раз войдите в базовый URL-адрес -> см. Содержимое из файла secret.txt.

Использование [L,R] вместо [L] будет использовать ответ 302 для обработки перенаправления. Это хороший вариант, если вы хотите, чтобы перенаправление было видимым в поле местоположения браузера.

<в сторону> Да, я понимаю, что это очень поздний ответ. Однако вопрос был высоким в результатах поиска Google, поэтому я хотел подробно рассказать о моем подходе в случае, если я нахожусь в том же поиске в будущем. Если кто-то еще выигрывает, это даже лучше. </ Aside>

Ответ на объяснение:

Вам необходимо выполнить пользовательскую проверку подлинности, изначально вы не можете перенаправлять при аутентификации.

Решение :

Пользовательская реализация ErrorDocument с использованием метатега HTML, чтобы сделать возможным перенаправление при аутентификации, позволяет пользователю получить доступ к защищенной зоне при успешном завершении аутентификации (сервер всегда будет выбивать 401 при первой загрузке до ввода пользователя и пароля, поскольку браузер не ожидая такой аутентификации в первую очередь и получить отказ в доступе)

  AuthUserFile /path/to/users AuthName "Access Denied" AuthGroupFile /dev/null AuthType Basic Require valid-user ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=/failed.html\"></html>" 

Альтернатива I:

Начиная с Apache 2.4. вы можете использовать mod_auth_form с htaccess, чтобы сделать расширенную аутентификацию и использовать более надежное решение

http://httpd.apache.org/docs/trunk/mod/mod_auth_form.html

Альтернатива II:

Используйте php для обработки 401 ErrorDocument 401 /handle.php

http://php.net/manual/en/features.http-auth.php

Расширенная безопасность:

  ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=/kickout.php\"></html>" ErrorDocument 400 /kickout.php ErrorDocument 403 /kickout.php ErrorDocument 500 /kickout.php Deny from all Allow from 192.200.xx Allow from 192.200.xx Allow from 127.0.0.1 Allow from localhost 

У меня был один и тот же вопрос, и хотя это старый поток, я просто использовал документ ошибки 401 для отображения конкретной страницы, если аутентификация не удалась …

 ErrorDocument 401 /not-logged-in.php 

Казалось, это очень трюк для меня.