Мой 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>
Здесь вам нужны две вещи.
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]
В условиях убедитесь, что вы не переписываете существующие файлы / каталоги на сервере.