Вопрос по .htaccess, apache, url-rewriting, php – Как остановить прямое выполнение php-страницы с помощью правил htaccess?

3

В моем файле .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 в / register /

@merkuro Какие еще варианты ты думаешь? Я не хочу делать несколько URL-адресов в поисковых системах, когда пользователь будет ссылаться на мой сайт. Доступ к двум разным URL-адресам также вводит пользователя в заблуждение. Это не хорошо в соответствии с рекомендациями по юзабилити. Prashant
Не могли бы вы рассказать о причине, по которой вы не хотите разрешать & quot; прямую & quot; доступ к этому файлу? Может быть, есть несколько других вариантов в зависимости от ваших потребностей. merkuro

Ваш Ответ

6   ответов
0

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

Или это

Redirect register.php /register
Проблема со вторым правилом состоит в том, что в сочетании с тем, что в вопросе, он создает бесконечный цикл.
0

новый rel = каноническая ссылка разобраться в поисковых системах.

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

В register.php

if ( stristr( $_SERVER['REQUEST_URI'], '.php' ) )
{
    header ('HTTP/1.1 301 Moved Permanently');
    header ('Location: /register');
}
использование$_SERVER['REQUEST_URI'], SCR, IPT_NAME, по сути, идентиченFILEи, следовательно, тест дает всегда истину.
чертовски да backticks ...__file__ Я имел в виду.
о да, извините Исправлено, чтобы использовать правильное значение.
1

вам нужно использоватьстрока запроса, Итак, попробуйте это правило:

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

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

RewriteRule ^register/$ register.php
4

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

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

Затем в вашем index.php вы можете просто выбрать, какую функцию / файл вызывать, разбив и проверив параметр $ _GET [& quot; file & quot;]. Чтобы быть на 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;

Update

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

Это подход, который многие платформы используют для создания читаемых URI. +1
3

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

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

Options -Indexes
order   allow,deny
deny    from all

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

0

mod_rewriteиспользуйте вариант ответа SleepyCod:

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

Объяснение:

[NC]: Makes the condition case-insensitive, just in case you're on a windows box. Condition 1: The requested filename is 'register.php', and Condition 2: The request is no subrequest (this is important, since every new round through RewriteRules actually creates subrequests). Rule: essentially do nothing Flags: [F]: Send an 403 Forbidden header, [L]: This is the last rule to apply, skip all following rewrite rules

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

Ура,

да, действительно, спасибо!
Я думаю, что вы где-то забыли флаг [NC]!

Похожие вопросы