重写的URL没有提取ID PHP

时间:2014-03-30 10:01:58

标签: php .htaccess mod-rewrite redirect get

我已经使用.htaccess重写了我的网址,所有内容都可以正常进行重定向,但是找不到所选文章的ID。

我的网址已使用以下网址从http://www/website.co.uk/news.php?id=111111更改为http://www.website.co.uk/news/111111

RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^news.php$ /news/%1? [L,R]

但是,在news.php页面中,我使用以下方式捕获ID号:

if(isset($_GET["id"])){
$id = $_GET["id"];
}
else{
header("Location: redirect.php?type=error");
exit();

因此,当我现在运行该页面时,它会重定向到redirect.php页面,因为它不是获取ID。我该如何排序这个错误?

3 个答案:

答案 0 :(得分:0)

您已编写外部重定向,将用户的浏览器指向http://www.website.co.uk/news/111111。这正是您的服务器将看到的URL - 因此,URL中没有ID参数。您必须再向.htaccess添加一行到内部,将该URL重写为旧(参数化)的一行:

RewriteRule ^news/([0-9]+) news.php?id=$1 [QSA]

用户仍会看到没有参数的重写URL,但您的PHP脚本将获得旧的(news.php?id=111111)。

答案 1 :(得分:0)

尝试使用PHP的preg_split()方法将URI拆分为可用值。

<?php
define('APPLICATION_URL', 'http://website.co.uk/');
$url = str_replace(APPLICATION_URL, null, $_SERVER['REQUEST_URI']);
$urlData = preg_split('/[\/\?]/', $url);
echo $urlData[0] . '/' . $urlData[1];
?>

以上代码应输出:news/111111

祝你好运!

答案 2 :(得分:0)

以下内容应该有效

RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^news.php$ /news/%1? [L,R]

RewriteRule ^news/(.*) news.php?id=$1 [QSA]

第二个RewriteRule应该默默地将网址重写回原始网址,以便用户仍然可以看到news/11111,但您的网页应该会获取id值。

编辑:试试这个

RewriteEngine On
#External redirect with THE_REQUEST trick; change R to R=301 when everything works correctly
RewriteCond %{THE_REQUEST} ^(GET|POST)\ /news\.php\?id=(.*)\ HTTP
RewriteRule ^ /news/%2\? [R,L]

#Internal rewrite
RewriteRule ^news/(.*) /news.php?id=$1 [L]