Ограничение и перенаправление строки запроса?

Можно ли ограничить параметры строки запроса моего сайта теми, которые я выделяю. При этом я могу перенаправить любые URL-адреса с параметрами строки запроса, не найденными в моем утвержденном списке, на мою страницу 404?

Например, я хочу, чтобы в качестве параметров строки запроса были разрешены только '? S =' и '? P =', поэтому если www.mysite.com/?x=whatever доступ к сайту перенаправит этого пользователя на мою страницу 404 - если www.mysite.com/?s=whatever тогда мой сайт будет отображать соответствующий контент.

4 ответа

Решение

Создайте список разрешенных параметров строки запроса, например:

$allowed_parameters = array( 's', 'q' );

Если массив $_GET содержит какие-либо ключи, кроме разрешенных, перенаправьте пользователя:

foreach ( $_GET as $key => value ) {
    if ( ! in_array( $key, $allowed_parameters ) ) {
        header( "Location: http://www.mysite.com/error404.html" );
        exit;
   }
}

использование exit немедленно прекратить обработку. Без этого перенаправление произойдет после обработки всех оставшихся ключей массива.

Если вы хотите сделать это с.htaccess, вы можете сделать что-то вроде этого:

RewriteCond %{REQUEST_URI} !(s=(.*)|404.html)
RewriteRule .* 404.html [R=404,L]

Кроме того, вы должны генерировать страницы для? S = динамически, поэтому обязательно сделайте исключение для index.php (или сценария, который вы используете):

RewriteCond %{REQUEST_URI} !(^s=(.*)|404.html|index.php)
RewriteRule .* 404.html [R=404,L]

Не проверял, но это должно работать.

Если вы хотите сделать это с помощью PHP, просто проверьте переменную $_GET и перенаправьте или отобразите страницу 404, если нет? S =:

if (!(isset($_GET['s'])) {
    header('HTTP/1.0 404 Not Found');
    header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, private');
    readfile('404.html');
    exit;
}

Вы получаете смысл.

Просто проверьте $_GET и найдите, есть ли запрещенные параметры, затем перенаправьте на свою страницу 404.

На Apache вы можете использовать mod_rewrite... что-то вроде:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^x=(allowed_values_of_x)$
RewriteRule ^path/in/uri$ /redirect/to/file?withquery=%1 [L]
RewriteCond %{QUERY_STRING} ^x=(.*)$
RewriteRule ^path/in/uri$ /redirect/to/404?withquery=%1 [R=404,L]

Если значения x действительны, он будет перенаправлен в файл с действительным x параметр, иначе он должен перенаправить на обработчик 404 с недействительным x параметр (так что вы можете сделать что-то необычное с ним, если хотите).

Посмотрите на условия Apache mod_rewrite по адресу: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

Другие вопросы по тегам