Как остановить прямое выполнение php-страницы с помощью правил htaccess? - PullRequest
3 голосов
/ 09 июля 2009

В моем файле .htaccess я определил следующее правило, чтобы сделать URL-адрес моей страницы регистрации как http://example.com/register/

RewriteRule register/ /register.php

Приведенное выше правило прекрасно, но я могу получить доступ к своей странице регистрации как с http://example.com/register/, так и с http://example.com/register.php.

Я не хочу, чтобы пользователь мог получить доступ к URL из http://example.com/register.php URL, есть ли какое-либо ПРАВИЛО, которое я могу определить в .htaccess, чтобы остановить выполнение регистра register.php URL или просто перенаправить любой прямой register.php запрос / регистрация /

Ответы [ 6 ]

4 голосов
/ 09 июля 2009

Если вы делаете это, чтобы избежать получения нескольких ссылок на один и тот же контент, вы можете просто не использовать «register.php» в любом месте вашей страницы. Я думаю, что ни один поисковик не «догадается» для определенного типа файлов, и если нет проблем с безопасностью, вы на безопасной стороне, потому что, по моему мнению, ни один пользователь не будет ссылаться на этот файл. Однако, если вы хотите быть уверены, просто перенаправьте всю свою функциональность через index.php через одну строку в вашем .htaccess, которая должна быть помещена в ваш корневой каталог www:

RewriteEngine on
RewriteRule ^(.*?)$ index.php?file=$1

В вашем index.php вы можете просто выбрать, какую функцию / файл вызывать, разбив и проверив параметр $ _GET ["file"]. Чтобы быть на 100% уверенным, никто не может получить доступ к вашему файлу register.php напрямую, просто переместите его (и все остальные) в отдельный каталог и включите файл .htaccess со следующей строкой:

DENY from all 

Для предотвращения прямого доступа есть несколько других опций. Просто define() переменная где-то в вашем index.php и в верхней части вашего register.php просто поместите

defined('access') or die('Intruder alert!');

наверху. Другой способ - быть честным и просто сообщить поисковым системам, что ваш контент был перемещен и что им больше не следует использовать старую ссылку:

header("Status: 301"); /* Content moved permanently */
header("Location: http://yourserver/Register/");
exit;

Обновление

Еще одна вещь, которая пришла мне в голову, вы также можете проверить $_SERVER["REQUEST_URI"], подключил ли пользователь какой-либо «.php» и действовать соответственно, либо полностью отказав в доступе, либо просто перенаправив на новое местоположение.

3 голосов
/ 20 октября 2012

Это правда, что вы не можете использовать директиву местоположения, но вы можете вставить файл .htaccess в любой каталог.

Просто, если вы положите это в него, скажите:

Options -Indexes
order   allow,deny
deny    from all

Вы можете скопировать и вставить этот файл в любой (корневой) каталог, который хотите защитить от внешнего исполнения.

1 голос
/ 09 июля 2009

Чтобы проверить начальный запрошенный путь URL, вам нужно использовать строку запроса . Поэтому попробуйте это правило:

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php[/?\s]
RewriteRule (.+)\.php$ /$1 [L,R=301]

И затем снова ваше правило (в слегка измененном виде):

RewriteRule ^register/$ register.php
0 голосов
/ 09 июля 2009

Если вы хотите полностью заблокировать /register.php с помощью mod_rewrite, используйте вариант ответа SleepyCod:

RewriteCond %{REQUEST_FILENAME} register\.php [NC]
RewriteCond %{IS_SUBREQ} false
RewriteRule .* - [F,L]

Пояснение:

  • [NC]: делает условие нечувствительным к регистру, на случай, если вы находитесь в окне Windows.
  • Условие 1: запрошенное имя файла: «register.php», и
  • Условие 2: запрос: нет подзапрос (это важно, поскольку каждый новый раунд через RewriteRules фактически создает подзапросы).
  • Правило: по сути ничего не делай
  • Флаги: [F]: отправьте запрещенный заголовок 403, [L]: это последнее правило, которое нужно применить, пропустите все следующие правила перезаписи

Правильно переписывать - это искусство само по себе. Предлагаю внимательно прочитать http://httpd.apache.org/docs/2.2/rewrite/.

Приветствия

0 голосов
/ 09 июля 2009

Игнорируя часть взаимодействия с пользователем, вы можете реализовать new rel = canonical link для сортировки поисковых систем.

Хотя для в этом случае вам, вероятно, следует просто использовать перенаправление 301 из /register.php в / register /

В register.php

if ( stristr( $_SERVER['REQUEST_URI'], '.php' ) )
{
    header ('HTTP/1.1 301 Moved Permanently');
    header ('Location: /register');
}
0 голосов
/ 09 июля 2009

Попробуйте это.

RewriteCond %{REQUEST_FILENAME} ^register\.php$ [NC]
RewriteRule ^/register register.php

или это

Redirect register.php /register
...