Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php URL重写和重定向(使用数据库数据)_Php_Apache_.htaccess_Mod Rewrite_Url Rewriting - Fatal编程技术网

Php URL重写和重定向(使用数据库数据)

Php URL重写和重定向(使用数据库数据),php,apache,.htaccess,mod-rewrite,url-rewriting,Php,Apache,.htaccess,Mod Rewrite,Url Rewriting,我的url是http://testurl.com/user.php?id=1&name=TestUser 上面链接的默认url应该是http://testurl.com/user/12345/TestUser 如果用户试图在自己的浏览器链接中更改它,如下所示 http://testurl.com/user/12345 http://testurl.com/user/12345/ http://testurl.com/user/12345/TestUsers_bla-bla 然后url栏会自动更

我的url是
http://testurl.com/user.php?id=1&name=TestUser

上面链接的默认url应该是
http://testurl.com/user/12345/TestUser

如果用户试图在自己的浏览器链接中更改它,如下所示

http://testurl.com/user/12345
http://testurl.com/user/12345/
http://testurl.com/user/12345/TestUsers_bla-bla
然后url栏会自动更改为
http://testurl.com/user/12345/TestUser

编辑

<?php
$name = "This-is-a-test-user";
$id = 1;


$fields = array('id' => $id,
                'name' => $name);


$url = "http://localhost/view_user.php?" . http_build_query($fields, '', "&");
?>

<a href = "<?php echo $url; ?>"> View User</a>

在root/.htaccess文件中尝试此操作

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^user/([a-zA-Z0-9]+)/?$ /user.php?id=$1 [QSA,L]

RewriteRule ^user/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ /user.php?id=$1&name=$2 [QSA,L]

这些条件确保您不会重写服务器上的任何现有文件/目录。

为什么不尝试使用一个非常基本的规则,然后从那里开始

首先,您需要确保服务器启用了重写模块,然后在htaccess文件的顶部放置:

RewriteEngine On
然后,您可以使用正则表达式将您的重写规则放入。例如:

 RewriteRule ^user/(\w+)/(\w+)$ user.php?id=$1&name=$2

你需要两样东西

1)要处理的访问规则

  • http://testurl.com/user/12345
  • http://testurl.com/user/12345/
  • http://testurl.com/user/12345/xxx
避免重复内容的相应规则(将旧格式重定向到新格式
/user/ID/NAME

为此,您可以将此代码放入根htaccess中

Options -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} \s/user\.php\?id=([0-9]+)\s [NC]
RewriteRule ^ user/%1? [R=301,L]

RewriteCond %{THE_REQUEST} \s/user\.php\?id=([0-9]+)&name=([^&\s]+)\s [NC]
RewriteRule ^ user/%1/%2? [R=301,L]

RewriteRule ^user/([0-9]+)/?$ user.php?id=$1 [L]
RewriteRule ^user/([0-9]+)/([^/]+)$ user.php?id=$1&name=$2 [L]
注意:此时,请确保启用了mod_rewrite并且允许
htaccess
(在Apache配置文件中)

一个简单的测试:
http://example.com/user/12345/XXXXX
应该在内部重写为
/user.php?id=12345&name=XXXXX

2)现在您需要调整
user.php
逻辑(在这里您可以检查数据是否存在
对)


到目前为止,您的htaccess文件中有哪些内容?你试过重写规则吗?目前它是空白的。我尝试了多种选择,但都不起作用。所以,每次失败后,我都从头开始。如果可能的话,请你详细说明一下。正如我想理解的,我不想只是复制粘贴代码。谢谢你的欢迎!Apache文档中有一个关于Mod_重写的基本教程。请看一看。。谢谢你的回答。谢谢你的回答和解释。我今晚会试试,让你们知道。上面的代码也会创建漂亮的url吗?实际上我有一个页面有这个链接。此链接仍按原样显示。我已经在.htaccess文件中添加了该条目,但我在页面和浏览器地址栏上得到了相同的链接。是否有我可以排除故障的方法。Htaccess规则用于确保显示的url是新格式(漂亮url)。但这并不意味着你不能有错误,比如
http://example.com/user/12345/NAME_OF_ID_45678
(甚至是“最差”,一个未知的ID)。这就是为什么我添加了一个php逻辑代码来处理它。另外,确保您已经启用了mod_rewrite,并且允许htaccess(都在Apache配置文件中)。注意:您的htaccess必须在根文件夹中。我们鼓励您将“旧”链接替换为“新”链接(漂亮的url),但这不是强制性的,因为htaccess会将旧格式重定向为新格式。如果你尝试(点击你的旧链接),你会得到一个重定向到
http://testurl.com/user/1/TestUser
我的答案就是链接。它基于ID。例如,您可以尝试仅更改ID部分,或仅更改问题标题部分,您将看到如何处理它(作为我的php逻辑)。这是强制性的,因为htaccess对数据库中的数据一无所知。最后,出于搜索引擎优化的原因,所以让它的链接看起来像这样:它比(例如)
/questions.aspx?ID=30242996
更方便用户使用,而且您还可以在url中使用问题标题。这对于引用来说也更好(至少,它是,不再是强制性的)
<?php
if (!isset($_GET['id']) || empty($_GET['id']))
{
   // error page not found (since there is no ID)
   header("HTTP/1.1 404 Not Found");
   return;
}

if (!isset($_GET['name']) || empty($_GET['name']))
{
   // no name -> get it by its ID
   $name = getNameByID($_GET['id']); // this function checks in the database

   if ($name === NULL)
   {
      // error: ID is unknown -> page not found
      header("HTTP/1.1 404 Not Found");
      return;
   }

   // ID exists, we now have its name -> redirect to /user/ID/NAME (instead of /user/ID)
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: /user/".$_GET['id']."/".$name);
   return;
}

// if we reach here, we have an ID and a name in the url
// we have to check if NAME corresponds to ID (and if ID exists)

$name = getNameByID($_GET['id']); // this function checks in the database

if ($name === NULL)
{
   // error: ID is unknown -> page not found
   header("HTTP/1.1 404 Not Found");
   return;
}

// now, check if NAME in the url corresponds to the one we got from database

if ($name !== $_GET['name'])
{
   // it doesn't -> redirect to good NAME
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: /user/".$_GET['id']."/".$name);
   return;
}

// finally, here we're fine.
// do what you then have to do...

?>