htaccess и php - перенаправления и красивые URL - PullRequest
1 голос
/ 02 марта 2012

У меня есть интернет-сообщество, и оно сейчас растет. Мне нравится делать преобразование ссылок для моего веба, а затем мне нужно знать лучшее решение для моего случая.

Прямо сейчас мой htaccess выглядит примерно так:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/?$ index.php?page=user&username=$1 [L]

Вы можете ссылаться на таких пользователей, как этот domain.com / username , и это приятно.

Тогда у меня есть разные страницы, такие как

  • index.php? Страница = форум & ID = 1
  • index.php? Страница = someotherpage & ID = 1 & anotherid = 5
  • index.php? Страница = третья

... и так далее. Я хочу, чтобы они выглядели примерно так:

  • domain.com / Форум / 23 / название-оф-нить
  • domain.com / стр.2 / id1 / id2

... и т. Д.

Как создать красивые URL-адреса, не удаляя мою функцию domain.com/username? Какое решение вы бы предложили?

Я думал о создании файла, который проверяет URL, соответствует ли он каким-либо страницам, пользователям и так далее. Затем он будет перенаправлен с местоположением заголовка.

Ответы [ 4 ]

3 голосов
/ 02 марта 2012

Если все URL, которые вы собираетесь переписать, идут в одну и ту же конечную точку, вы можете просто использовать:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

в index.php:

<?php
$url = $_SERVER['REQUEST_URI'];

КакВы используете запрос URI, например, вы можете использовать простую проверку strpos:

<?php
$url = $_SERVER['REQUEST_URI'];

$rules = array(
    '/forum/' => 'forum',
    '/foo/' => 'foo',
    '/' => 'username'
);

foreach($rules as $pattern => $action) {
    if (strpos($url, $pattern) === 0) {
        // use action
        $file = "app/$action.php";
        require $file; 
        exit;
    }
}
// error handling - 404 no route found
3 голосов
/ 02 марта 2012

Я думал о создании файла, который проверяет URL,

у вас действительно есть этот файл, он index.php

если оно соответствует каким-либо страницам, пользователям и т. Д. Затем он будет перенаправлен с местоположением заголовка.

это неправильно. HTTP перенаправление не сделает ваши URL "красивыми"
Вы должны включить соответствующий файл, а не перенаправлять на.

Просто измените ваше правило на более общее

RewriteRule ^(.*)$ index.php [L,QSA]
1 голос
/ 02 марта 2012

Обычно у вас есть два варианта.

  1. Направьте все URL на центральный диспетчер (FrontController), и этот PHP-скрипт проанализирует URL-адрес и включит правильные сценарии
  2. Обратите внимание на все возможныемаршрут (перезапись URL) у вас есть в .htaccess

Я всегда работал с вариантом 1, так как это обеспечивает максимальную гибкость при минимальных издержках mod_rewrite.Вариант 2 может выглядеть примерно так:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^forum/([^/]+)/([^/]+)/?$ index.php?page=forum&id=$1 [L]
RewriteRule ^otherpage/([^/]+)/([^/]+)/?$ index.php?page=someotherpage&id=$1&anotherid=$21 [L]
RewriteRule ^page/([^/]+)/?$ index.php?page=$1 [L]
# …
RewriteRule ^([^/\.]+)/?$ index.php?page=user&username=$1 [L]

Вы сказали

Я думал о создании файла, который проверяет URL-адрес, соответствует ли он каким-либо страницам, пользователям и т. Д.,Затем он будет перенаправлен с местоположением заголовка.

Хотя «создание файла, который проверяет URL», звучит очень похоже на вариант 1, «перенаправление с местоположением заголовка» - худшее, что вы можете сделать.Это может привести к

  • дополнительному циклу HTTP-обхода для клиента, что приведет к более медленной загрузке страницы
  • «красивый URL» не будет привязан, браузер покажет URL, который вымы перенаправлены на
  • потерянный ссылочный сок (SEO)
0 голосов
/ 02 марта 2012

Это можно сделать полностью с помощью htaccess или php

//First Parameer
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?page=$1

//Second Parameter 
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)$ index.php?page=$1&username=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)/$ index.php?page=$1&username=$2

Подробнее об этом здесь:http://net.tutsplus.com/tutorials/other/using-htaccess-files-for-pretty-urls/ http://www.roscripts.com/Pretty_URLs_-_a_guide_to_URL_rewriting-168.html

...