使用mod_rewrite php脚本重定向循环问题

时间:2012-09-27 19:44:00

标签: php apache mod-rewrite redirect redirect-loop

我有一个.htaccess文件,其中包含以下规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

在index.php中我有:

$route = (isset($_GET['route'])?explode('/',$_GET['route']):null);

if(!empty($route)){
    $route[0]; //movie
    //$route[1]; //movie-name

    header("Location: " . "http://192.167.1.189/site_name/movie/" . $route[1]);
    // $route[1] = 2271 (movie id)
    exit;
}

目标是从这个网址获取:

http://192.167.1.189/site_name/movie-page.php?id=2270

到这个网址:

http://192.167.1.189/site_name/movie/2270

我还想要一些其他网址更改,例如... / movie-page.php到... / movie /等等......

我理解为什么会得到重定向循环,但我不知道如何修复它。如何将所有(除了有效的文件和目录,如css文件和图像)重定向到中央php文件,然后重定向到用户友好的URL?

1 个答案:

答案 0 :(得分:1)

  

我理解为什么会得到重定向循环,但我不知道如何修复它。如何将所有(除了有效的文件和目录,如css文件和图像)重定向到中央php文件,然后重定向到用户友好的URL?

所以听起来这就是你要做的事情:

  1. 浏览器请求友好的网址
  2. 重写.htaccess中的规则将友好重写为?route=查询字符串
  3. index.php脚本接收请求并对其进行处理,并为浏览器提供所需内容
  4. 但你也想这样做:

    1. 浏览器使用?route=查询字符串
    2. 请求一个丑陋的网址
    3. 重写规则不执行任何操作,因为URI不匹配
    4. index.php脚本接收请求,发现它是一个丑陋的URL,并将浏览器重定向到友好的浏览器。
    5. 为此,您需要在脚本中检查原始请求的URL的外观。您可以通过查看$_SERVER['REQUEST_URL']$_SERVER['REQUEST_URI']变量来执行此操作。他们应该告诉你浏览器实际请求的URI。

      例如,如果有人在其浏览器的URL地址栏中输入了URL:http://192.167.1.189/site_name/movie/2270,则重写规则会将其路由到index.php,然后在您的php文件中,您可以检查{ {1}}它会说:$_SERVER['REQUEST_URI']

      但是,如果有人输入了他们的网址栏/site_name/movie/2270,则http://192.167.1.189/site_name/movie-page.php?id=2270将为$_SERVER['REQUEST_URI']。所以也许你想要 if 声明中的类似内容:

      /site_name/movie-page.php?id=2270

      因此,您要确保if(!empty($route) && strpos($_SERVER['REQUEST_URI'], "site_name/movie/") != 1 ){ var中存在某些内容,并且$route var不以$_SERVER['REQUEST_URI']开头。