RewriteCond с использованием PHP и .htaccess - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь выполнить условный RewriteCond, используя PHP и htaccess. Идея состоит в том, чтобы прочитать тщеславные URL-адреса из файла JSON и соответственно выполнить перенаправление в файле PHP.

Работает, если его нужно перенаправить на другой URL-адрес, как показано в коде с использованием заголовков.

.htaccess

RewriteEngine On
RewriteCond $2 !^(redirect\.php)
RewriteRule ^(.*)$ redirect.php?l=$2 [L]

redirect.php

$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$found = true;
if($found){
  header('HTTP/1.1 301 Moved Permanently');
  header(sprintf('Location: %s', 'https://www.google.com'));
}else{//no redirection is need, stay in the same URL
  header('HTTP/1.1 301 Moved Permanently');
  header(sprintf('Location: %s', $url)); //throw error ERR_TOO_MANY_REDIRECTS
}

Однако его не следует перенаправлять, если условие «найдено» не выполняется, как показано, и в данный момент я пытаюсь перенаправить на ту же страницу с помощью переменной $ url, и она возвращает ошибку «ERR_TOO_MANY_REDIRECTS». Есть ли другой способ эффективно обрабатывать эту часть кода?

1 Ответ

1 голос
/ 04 июля 2019

Итак, основываясь на комментариях, я думаю, что смогу дать соответствующий ответ.
Итак, ваша цель - реагировать на вызываемый URL и перенаправлять на основе того, является ли URL «известным» вашей системе ($found) илине?Если это так: верно ли, что вы хотите перенаправить в Google, если значение $found равно true?Я не совсем понимаю цель этого - может быть, вы имеете в виду !$found?Таким образом, все неизвестные запросы перенаправляются в Google?

Исходя из этих предположений, вы все равно можете отображать содержимое из другого файла PHP или HTML на своем собственном сервере без перенаправления клиента.

Предположим, пользовательские вызовыhttps://example.org/some/fancy/page.Это будет перенаправлено на ваш redirect.php, где вы можете прочитать часть some/fancy/page из $_GET["l"].

Когда ваш файл JSON выглядит примерно так (пожалуйста, приведите реальный пример, если это предположение полностью неверно).

{
    "some/fancy/page": "views/page1.html",
    "some/other/page": "views/page2.html"
}

Ваш redirect.php может затем проверить этот словарь JSON на наличие известных и неизвестных запросов и перенаправить или загрузить контент на основе результата:

$called = $_GET["l"]; // contains "some/fancy/page"
$json = json_decode(file_get_contents("path_to_json"), true);

$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

// Check if the called URL is part of your JSON file.
$found = isset($json[$called]);

if(!$found) { // Note the ! from my assumption
  // We did not find this -> redirect to google
  header('HTTP/1.1 301 Moved Permanently');
  header(sprintf('Location: %s', 'https://www.google.com'));
} else {
  // Page is found on the local server - load from the file listed in JSON
  // (views/page1.html) and send it to the client.
  echo file_get_contents($json[$called]);  

  /**
  // In case your JSON contains external URLs, e.g. https://fancypage.org for "some/fancy/page", you can still use redirection
  // This will, however, not end up on your own server and thus will not trigger the rewrite rule.
  header('HTTP/1.1 301 Moved Permanently');
  header(sprintf('Location: %s', $json[$called]));
  **/
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...