Как я могу отобразить оптимизированные для SEO URL-адреса, используя mod_rewrite? - PullRequest
4 голосов
/ 03 октября 2009

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

Первое, что я заметил, были ужасные URL, поэтому я хочу, чтобы они переписывались на что-то более информативное. Вот все возможные шаблоны:

/index.php?m=ModuleType&categoryID=id
/index.php?m=ModuleType&categoryID=id&productID=id
/index.php?page=PageType
/index.php?page=PageType&detail=yes

Итак, в основном я хочу преобразовать их во что-то вроде:

/ModuleType/Category
/ModuleType/Category/ProductName
/Page
/Page

Я не использовал mod_rewrite до того, как какие-либо советы или примеры были бы великолепны!

Спасибо.

Ответы [ 3 ]

1 голос
/ 03 октября 2009

Я никоим образом не эксперт по mod_rewrite, но это пример того, как я собрал .htaccess для сайта Image Flair:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)\.png$ imageFlair.php?mode=$1&userid=$2 [L]
RewriteRule ^(.*)\.png$ imageFlair.php?userid=$1 [L]
</IfModule>

Это в основном карты:

MODE / USERID.png -> imageFlair.php? Режим = Режим & Идентификатор_пользователя = USERID

и

USERID.png -> imageFlair.php? Идентификатор_пользователя = USERID

Вы должны быть в состоянии приспособить это к вашим потребностям, но у вас может быть несколько проблем:

  1. Если вы хотите использовать в именах «имена», а не идентификаторы, вам придется изменить PHP, чтобы они принимали имена.
  2. У вас может быть проблема с конфликтом / Page и / ModuleType, если вы хотите также включить в Page больше параметров, кроме случаев, когда вы можете собрать регулярное выражение, которое может определить, какие именно.

Если перейти к списку URL-адресов, которые вам нужны, это должно сработать, хотя я не буду утверждать, что это лучший или единственный способ сделать это: -)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)/(.*)$ index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^(.*)/(.*)$ index.php?m=$1&categoryID=$2 [L]
RewriteRule ^(.*)$ index.php?Page=$1 [L]
</IfModule>

Как и предполагалось, вы можете заменить. * На [^ /] +, но у меня были проблемы с несоответствиями, когда я это делал, и у меня не было времени для устранения неполадок, поэтому YMMV: -)

1 голос
/ 03 октября 2009

Из вашего поста не совсем понятно, что это за переменные. Но если предположить, что ModuleType, id (x2) и Page являются переменными, то в файле .htaccess должны работать следующие правила с обратными ссылками.

RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^([^/]+)$ /index.php?page=PageType [L]
RewriteRule ^([^/]+)/detail$ /index.php?page=PageType&detail=yes [L]

Последнее не имело смысла, как вы написали. Таким образом, вместо этого вы можете добавить /detail в конце.

Они должны скользить прямо поверх существующих приложений без каких-либо изменений в приложении. Поскольку они не перенаправляют с [R], это будет прозрачно для ваших пользователей.

1 голос
/ 03 октября 2009

mod_rewrite лучше использовать для обратного: переписать внутренние запросы /ModuleType/Category/ProductName в /index.php?m=ModuleType&categoryID=id&productID=id. Использование новых URL-адресов в документах является задачей вашего приложения.


Редактировать Вот пример того, как может выглядеть функция, которая превращает ваши параметризованные URL-адреса в новые:

function url($url, $rules) {
    $url = parse_url($url);
    parse_str($url['query'], $url['query']);
    $argNames = array_keys($url['query']);
    foreach ($rules as $rule) {
        if ($rule[0] == $url['path'] && array_keys($rule[1]) == $argNames) {
            $newUrl = $rule[2];
            foreach ($rule[1] as $name => $pattern) {
                if (!preg_match('/'.addcslashes($pattern, '/').'/', $url['query'][$name], $match)) {
                    continue 2;
                }
                $newUrl = str_replace('<'.$name.'>', $match[0], $newUrl);
            }
            return $newUrl;
        }
    }
    return $url;
}

$rules = array(
    array(
        '/index.php',
        array('m'=>'.*', 'categoryID'=>'.*', 'productID'=>'.*'),
        '/<m>/<categoryID>/<productID>'
    )
);
echo '<a href="' . url('/index.php?m=ModuleType&categoryID=categoryID&productID=productID', $rules) . '">/ModuleType/Category/ProductName</a>';
...