我有一个.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到/电影等等…
我理解为什么我会得到重定向循环,但我不知道如何修复它。我如何将所有(除了有效的文件和目录,如css文件和图像)重定向到一个中心php文件,然后重定向到用户友好的url?
我理解为什么我会得到重定向循环,但我不知道如何修复它。我如何将所有(除了有效的文件和目录,如css文件和图像)重定向到一个中心php文件,然后重定向到用户友好的url?
所以听起来这就是你想要做的:
- 浏览器请求一个友好的URL
- .htaccess中的重写规则将友好重写为具有
?route=
查询字符串的规则 index.php
脚本接受请求并对其进行处理,并为浏览器提供所需的内容
但你也想做:
- 浏览器使用
?route=
查询字符串请求一个丑陋的URL - 重写规则不执行任何操作,因为URI不匹配
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(!empty($route) &&
strpos($_SERVER['REQUEST_URI'], "site_name/movie/") != 1
){
因此,您需要确保$route
变量中有内容,并且$_SERVER['REQUEST_URI']
变量不以/site_name/movie/
开头。