Создайте тщеславные URL в конфигурации LAMP - PullRequest
3 голосов
/ 04 мая 2011

Каков наилучший способ создания пользовательских URL в конфигурации LAMP?

Например, страница профиля пользователя может быть доступна следующим образом:

http://www.website.com/profile.php?id=1

Теперь, если пользователь вводит "URL-адрес тщеславия" для своего профиля, я бы хотел, чтобы URL-адрес тщеславия загружал страницу выше.

Например, если пользователь выбирает «i.am.a.user» в качестве своего URL-адреса тщеславия, а его идентификатор пользователя в базе данных равен 1, тогда http://www.website.com/profile.php?id=1 будет доступен по этому URL-адресу и http://www.website.com/i.am.a.user.

Я знаю, что мод переписывает в .htaccess, но не уверен, как это будет работать здесь.

Как я уже говорил, мой сайт на PHP, MySQL, Linux и Apache.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 04 мая 2011

Предположим, что на других ваших страницах были определенные URL-адреса, с которыми можно было бы проверить, следующее должно помочь:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?user=$1 [L]

Это помогает поддерживать текущие URL-адреса, в то же время позволяя использовать ярлыки URL-адресов пользователя.Кроме того, RewriteRule будет соответствовать только тем URL-адресам, которые не содержат /, что поможет защитить от непреднамеренных перенаправлений.Итак,

/i-am-a-user -> MATCHES
/i_am_a_user -> MATCHES
/i-!am-a-user -> NOT MATCHED
/i.am.a.user  -> NOT MATCHED
/i.am.a.user/ -> NOT MATCHED
/some/page/ -> NOT MATCHED
/doesnotexist.php -> NOT MATCHED
/doesnotexist.html -> NOT MATCHED

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Я обновил приведенные выше правила, так что фактические файлы / каталоги неперенаправить, а также убедиться, что любой файл .php или .html также не отправлен на profile.php.

4 голосов
/ 04 мая 2011

Переписать для site.com/user/USERNAME:

В корневом веб-каталоге поместите файл .htaccess:

RewriteEngine on
RewriteRule ^user/(.+)$ profile.php?name=$1 [L]

Это перенаправит все запросыкоторый начинается с «user» в profile.php и передает URI в $_GET['name'].Этот метод предпочтителен, если у вас много файлов / каталогов / других перезаписей.

Переписать для site.com/USERNAME:

RewriteEngine on
# if directory or file exists, ignore
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ profile.php?name=$1 [L]

Это маршруты к профилю.php ТОЛЬКО если запрашивающий файл или каталог не существует, И когда URI запроса не пуст (например, www.site.com)

PHP-серверная часть

Теперь в profile.php у вас может быть что-то вроде этого:

if (!empty($_GET['name'])
    $user = ... // get user by username
else 
    $user = ... // get user by id
1 голос
/ 04 мая 2011

Что ж, вы можете решить эту проблему, используя apache RewriteMap , конечно. RewriteMap может быть простым текстовым файлом (который вы регулярно обновляете в зависимости от того, что вводят ваши пользователи), или же вы можете указать его на скрипт (Perl, PHP, что вам подходит), чтобы выполнить переписывание за вас.

Краткое описание того, как настроить это с помощью PHP, см. В Использование базы данных MySQL для управления mod_rewrite через PHP .

1 голос
/ 04 мая 2011

Сначала настройте файл .htaccess для отправки всех запросов на файлы и каталоги, которые не существуют, в один файл php:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) router.php [NC,L]

Затем внутри вашего router.php посмотрите на $ _SERVER ['REQUEST_URI '], чтобы получить имя пользователя, которое вы затем сможете использовать в своем запросе для получения данных о пользователе.

Предполагается, что все URL-адреса, которые не являются страницами профиля пользователя, существуют как физические файлы на вашем сервере.

Если это не так, вы можете выполнить некоторую логику в router.php, чтобы решить, что делать с каждым запросом.Выполните в Google поиск по URL-адресу в php, и вы получите множество примеров.

...