php重定向后,友好的网址没有显示在位置栏中

时间:2016-08-30 00:38:28

标签: php apache .htaccess mod-rewrite url-rewriting

我正在使用mod-rewrite将友好的URL重定向到php脚本,该脚本在关联数组中查找实际的URL,然后使用header重定向(“location:$ url”);

我的重写规则是

RewriteEngine On
RewriteCond %{REQUEST_URI}  "^/$"
RewriteRule ^(.*) http://%{HTTP_HOST}/index.php [L,R=301] 
RewriteCond %{REQUEST_URI} !=/home.php
RewriteCond %{REQUEST_URI} !(\.php|\.html|\.htm|\.png|\.gif|\.css|\.htm|\.js|\.txt|\.xml)$ [NC]
RewriteRule ^([^/]*)$ /home.php?page=$1 [L] 

这会导致$ url出现在浏览器的位置栏中,而我希望显示友好的url。

我从这篇文章中了解Rewriting URL and making new URL show in location bar为什么会发生这种情况(因为php位置标题)但我不知道如何实现我的目标。

有很多动态页面由几个内部php脚本构建,并且为脚本和请求参数的所有组合编写mod-rewrite规则将很困难。

所以我的问题是,如何让友好的网址显示在位置栏中。

2 个答案:

答案 0 :(得分:1)

在PHP脚本中,而不是使用

重定向用户

header("location: $page");

您需要包含该页面。您肯定希望首先确保$ page的值是可接受的值:

<?php

// /home.php

$page = $_GET['page'];

$valid_pages = array(
    'about',
    'contact',
);

if(in_array($page, $valid_pages)){
   include($page . '.php');
   exit;
}

die('Invalid Page.');

答案 1 :(得分:0)

我现在已经解决了。

包含对我不起作用,因为许多$页面的内容类型为“?a = b”。

我解决了它:

if(array_key_exists($page, $pages)){
$page = $pages[$page];
if (strpos($page,'?')) {        
    $html = file_get_contents(<site>.$page);
    echo  $html;
}
else include(<path>.$page);
exit;
}
die('Invalid Page.');

感谢泰勒指出我正确的方向。我接受了他的回答