使用PHP和.htaccess的RewriteCond

时间:2019-07-03 12:08:52

标签: php .htaccess mod-rewrite

我正在尝试使用PHP和htaccess执行有条件的RewriteCond。这个想法是从JSON文件中读取虚荣URL,然后在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 个答案:

答案 0 :(得分:1)

因此,根据评论,我想我可以提供一个适当的答案。
因此,您的目标是对被调用的URL做出反应并根据URL是否为系统“ $found”已知而重定向?如果是这样的话:如果$found为true,您要重定向到Google是否正确?我真的不明白它的目的-也许您是说!$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]));
  **/
}