Перенаправление и перенаправление 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> 

Solutions Collecting From Web of "Перенаправление и перенаправление URL-адресов (с данными базы данных)"

Здесь вам нужны две вещи.

1) правила htaccess для обработки

  • http://testurl.com/user/12345
  • http://testurl.com/user/12345/
  • http://testurl.com/user/12345/xxx

и соответствующие правила, чтобы избежать дублирования контента (перенаправить старый формат /user.php?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 (здесь вы проверяете наличие пары данных <ID, NAME> )

 <?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... ?> 

Я намеренно пишу этот код с «дублирующимися» частями, чтобы вы могли понять логику.
Конечно, вы можете улучшить его.

Почему бы не попытаться заставить работать очень основное правило, а затем оттуда.

Сначала вам нужно убедиться, что у сервера включен модуль перезаписи, а затем вверху вашего файла htaccess:

 RewriteEngine On 

Затем вы можете поместить свои правила перезаписи с помощью регулярного выражения. Например:

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

Попробуйте это в файле 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] 

В условиях убедитесь, что вы не переписываете существующие файлы / каталоги на сервере.