1

我有一个具有以下规则的 .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

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

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

4

1 回答 1

1

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

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

  1. 浏览器请求一个友好的 URL
  2. .htaccess 中的重写规则用?route=查询字符串重写友好的规则
  3. index.php脚本接受请求并对其进行处理,并为浏览器提供所需的内容

但你也想做:

  1. ?route=浏览器使用查询字符串请求一个丑陋的 URL
  2. 重写规则什么都不做,因为 URI 不匹配
  3. index.php脚本接受请求,发现它是一个丑陋的 URL,并将浏览器重定向到友好的 URL 。

为此,您需要在脚本中检查最初请求的 URL 的样子。您可以通过查看$_SERVER['REQUEST_URL']$_SERVER['REQUEST_URI']变量来做到这一点。他们应该告诉你浏览器实际请求的 URI。

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

但是如果有人在他们的 URL 地址栏中输入:http://192.167.1.189/site_name/movie-page.php?id=2270,那么$_SERVER['REQUEST_URI']将是/site_name/movie-page.php?id=2270。所以也许你想要在你的if语句中这样的东西:

if(!empty($route) && 
   strpos($_SERVER['REQUEST_URI'], "site_name/movie/") != 1
  ){

因此,您要确保 var 中有某些$route内容并且$_SERVER['REQUEST_URI']var 不是以/site_name/movie/.

于 2012-09-27T21:27:40.563 回答