Как сделать лучший URL с .htaccess и несколькими параметрами? - PullRequest
1 голос
/ 23 апреля 2010

У меня очень длинный недружественный URL, и я ищу, чтобы сделать SEO лучше для сайта:

http://www.site.com/sub-site/index.php?page=nameofpage&locale=en_EN

Я хотел бы иметь это вместо: http: // www.site.com/sub-site/en/nameofpage

все URL-адреса жестко запрограммированы в виде ссылок:

<a href="index.php?page=nameofpage&locale=en_EN">link</a>

Каков наилучший способ достиженияэто с мод-переписать?Мне особенно трудно этого добиться:

  • объединение обоих параметров, страницы и локали
  • Превращение ISO-локалей EN_en в en в URL
  • Как мне писать ссылки?используя URL-адрес результата или index.php? страницу ... схема контроллера?

РЕДАКТИРОВАТЬ: Я схожу с ума!Я не могу заставить это работать !!Чувствую себя так глупо ... но, может ли кто-нибудь помочь мне с точным файлом .htaccess, который мне нужен для этого? Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

mod_rewrite - невероятно сложный зверь. Это должно помочь вам начать! Просто прочитайте документацию и поиграйтесь с ней. Вы скоро это освоите!

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Checks to see if the user is attempting to access a valid file,
    # such as an image or css document. If this isn't true, it sends the
    # request to index.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(.*)$ index.php?locale=$1&page=$2
    RewriteRule ^(.*)$      index.php?page=$1
</IfModule>

Редактировать: Вы должны скопировать и вставить это в .htaccess файл.

1 голос
/ 23 апреля 2010

РЕДАКТИРОВАТЬ: Я прошел и проверил это на одном из моих серверов.Это прекрасно работает для меня:

RewriteEngine On
RewriteRule ^sub-site/([a-z_]+)/([a-z0-9_-]+)$ /sub-site/index.php?locale=$1&page=$2

Это дает вам большую часть пути, но не выполняет перевод локали (en => en_EN), а просто доставляет локаль как естьPHP скрипт.Используя mod_rewrite, я бы рекомендовал RewriteMap;однако, если у вас только есть доступ к .htaccess (как на общем хосте), вы не можете использовать RewriteMap.

Итак, для выполнения перевода локали, я думаю, вы 'Лучше всего делать это на стороне PHP.Вы можете использовать одну из перечисленных ниже платформ или просто сделать это самостоятельно.

Если у вас есть доступ к конфигурации виртуального хоста, вы создадите текстовый файл, например:

en en_EN
fr fr_FR
ca fr_CA

Если этот файл находится в /path/to/localemap.txt, вы получите:

RewriteMap locales txt:/path/to/localemap.txt
RewriteRule ^sub-site/([a-z_]+)/([a-z0-9_-]+)$ /sub-site/index.php?locale=${locales:$1|en_EN}&page=$2

По умолчанию используется en_EN, если на карте ничего не найдено.

Надеюсьэто помогает!


Если вы просто используете .htaccess, то mod_rewrite легко сделает то, что вы хотите.

Возможно, вы захотите посмотреть RewriteMap для своих категорий или локали, хотя вы можете просто взять эту часть URL и использовать ее в качестве параметранепосредственно.Вот пример для начала:

RewriteRule /sub-site/([a-z_]+)/([a-z0-9_]+) /sub-site/index.php?locale=$1&page=$2

Вы действительно хотите сузить регулярные выражения, используемые, чтобы сделать их более специфичными для поддерживаемых вами локалей и категорий, но я думаю, что это хорошая отправная точка.

Другие PHP-фреймворки, особенно ориентированные на MVC, также предоставляют аналогичные функции маршрутизации URL.Примеры:

...