Переписать симпатичный или оптимизированный для SEO URL через htaccess - PullRequest
1 голос
/ 25 февраля 2020

У меня проблема с преобразованием URL-адресов из Dynami c в Stati c.

У меня есть сайт, на котором разные страницы генерируются с помощью Dynami c url, например:

www.example.com/?pr=project-abc123

Я хотел бы переписать URL каждого из них с помощью htaccess, сделав его stati c, например:

www.example.com/project-abc123

// or

www.example.com/pr/project-abc123

Теперь я нашел этот код htaccess, который, кажется, работает:

RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} \?
RewriteCond %{QUERY_STRING} ^p=(.*)$
RewriteRule (.*) http://example.com/%1? [L,R=301] 
RewriteRule ^(.*)$ /index/?pr=$1[L]

URL переписываются, как указано (первый тип, whitout / pr /), но выдает ошибку множественный выбор . Что я делаю не так?

1 Ответ

0 голосов
/ 25 февраля 2020

Давайте поймем директиву RewriteRule, которая является настоящей рабочей лошадкой для переписывания.

A RewriteRule состоит из трех аргументов, разделенных пробелами. Аргументы:

  • Шаблон: на какие входящие URL-адреса должно влиять правило;
  • Подстановка: куда следует отправлять совпадающие запросы;
  • [flags]: опции, влияющие на переписанный запрос.

Начнем со следующего фрагмента:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Первая строка кода, описывающая RewriteEngine, включена. Здесь я использую директиву RewriteCond, которая определяет условие правила перезаписи. Используя директиву RewriteCond, мы определили два условия здесь. Эта директива взяла переменную сервера с именем REQUEST_FILENAME. Два приведенных выше условия указывают, что запрос не является файлом или каталогом, а затем соответствует правилу, установленному RewriteRule. Подробнее см. по этому вопросу.

Теперь пришло время написать некоторые правила переписывания. Давайте преобразуем

www.example.com/?pr=project-abc123

// to 

www.example.com/project-abc123

и переписать правило будет:

RewriteRule ^(.*)$ index.php/?pr=$1 [L]

И чтобы получить www.example.com/pr/project-abc123, нам нужно правило, как показано ниже:

RewriteRule ^/?([a-z]+)/(.*)$ index.php/?$1=$2 [L]

// or

RewriteRule ^/?pr/(.*)$ index.php/?pr=$1 [L]

Флаг [L] указывает mod_rewrite прекратить обработку набора правил. Это означает, что если правило совпадает, дальнейшие правила обрабатываться не будут.

...