Как создать дружественные URL-адреса с помощью .htaccess?

Мне тяжело работать с .htaccess. Я хочу создать дружественные URL-адреса для сайта, над которым я работаю …

В основном я хочу преобразовать это:

http://website.com/index.php?ctrl=pelicula&id=0221889 http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters 

В этом:

 http://website.com/pelicula/0221889/ http://website.com/pelicula/0221889/posters/ 

В случае, если это необходимо позже, я также хочу знать, как добавить заголовок статьи в конец URL-адреса, как это (я использую PHP):

 http://website.com/pelicula/0221889/the-article-name/ http://website.com/pelicula/0221889/the-article-name/posters/ 

Примечание. Метод Stackoverflow также хорош для меня, например, URL-адрес этого вопроса:

 http://stackoverflow.com/questions/3033407/htacces-to-create-friendly-urls-help-needed 

Но вы можете положить что-нибудь после id, и он также будет работать. как это:

 http://stackoverflow.com/questions/3033407/just-anything-i-want 

Я использовал некоторые автоматические веб-инструменты для создания файла .htacces, но он работает неправильно. Поэтому я прошу вас о помощи.

Я также буду рад, если вы порекомендуете .htacces лучшие практики и рекомендации ..

EDIT: основанный на некоторых ответах, которые я получил здесь, я сказал:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] </IfModule> 

Но я получаю сообщение об ошибке «страница не найдена» по умолчанию.

Я также пробовал:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]+)/(\d+)/([^/]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] RewriteRule ^([^/]+)/(\d+)/?$ index.php?ctrl=$1&id=$2 [QSA,L] RewriteRule ^([^/]+)/?$ index.php?ctrl=$1 [QSA,L] </IfModule> 

Это также не работает. Это приведет меня к моей странице 404.php по умолчанию.

mod_rewrite включен и работает.

Помогите!

В корневом каталоге документа для http://website.com/ я бы поставил файл htaccess следующим образом:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> 

Затем в вашем скрипте PHP вы можете манипулировать переменной $_GET['url'] как вам угодно:

 $path_components = explode('/', $_GET['url']); $ctrl=$path_components[0]; $id=$path_components[1]; $tab=$path_components[2]; 

Просто протестируйте это на местном уровне и, похоже, сделайте то, что вам нужно:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/.]+)(?:/)?$ /index.php?ctrl=$1 [L] RewriteRule ^([^/.]+)/([^/.]+)(?:/)?$ /index.php?ctrl=$1&id=$2 [L] RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)(?:/.*)?$ /index.php?ctrl=$1&id=$2&tab=$3 [L] </IfModule> 

Это то, что он делает:

Эти перезаписи будут работать с трейлером или без него – если вы хотите, чтобы они работали без косой черты, удалите (?:/)? с конца первых двух переписываний. Вы также можете использовать mod_rewrite для добавления или удаления конечной косой черты по мере необходимости.

Первый, предположив, что ваш файл .htaccess находится в корне:

 RewriteRule ^([a-zA-Z]+)/([0-9]+)(/)?$ index.php?ctrl=$1&id=$2 

Второй:

 RewriteRule ^([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)(/)?$ index.php?ctrl=$1&id=$2&tab=$3 

или если это всегда posters а не разные вкладки:

 RewriteRule ^([a-zA-Z]+)/([0-9]+)/posters(/)?$ index.php?ctrl=$1&id=$2&tab=posters 

Я добавил (/)? что должно означать, что URI будет работать с косой чертой или без нее.

Что касается другого, я бы, вероятно, всегда оставил статью в конце, чтобы переписать или добавить другое /value чтобы переписать знает разницу между вкладкой и статьей или исключить тире из регулярного выражения.

Чтобы получить этот URL:

 http://website.com/pelicula/0221889/posters 

переписан на следующее:

 http://website.com/index.php?ctrl=pelicula&id=0221889&tab=posters 

Я бы сделал это:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] </IfModule> 

Вы должны выбрать, хотите ли вы поместить заголовок после id и делать это все время из-за того, что переменная вкладки находится в последней позиции: вы должны знать, будет ли она номером 3 или номером 4. Если вы сделаете это :

 RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)$ index.php?ctrl=$1&id=$2&tab=$4 [QSA,L] 

третья скобка не захвачена и поэтому может содержать что угодно.

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

Удостоверьтесь, что у вас нет другого файла .htaccess выше в дереве каталогов, который противоречит .htaccess вашего сайта.

Я использую это в моем файле .htaccess

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* rewrite.php [L] 

В принципе, если он не существует в виде файла или каталога, используйте rewrite.php и пусть это позаботится о синтаксическом анализе URL и т. Д. Я считаю, что самый простой способ переписать.

Кроме того, проверьте результаты var_dump($_SERVER) (где-то вы знаете, что работает), чтобы узнать, является ли то, что вы считаете самым верхним каталогом, действительно является самой верхней директорией, например: вы можете писать в /var/www/domain/www/index.php вместо /var/www/domain/index.php

Основываясь на опыте, я бы рекомендовал настроить вашу схему URI, чтобы упростить применение правила к URI, которое вы ЗНАЕТ повторно переписываете. Например

Преобразуйте это:

 http://website.com/index.php?ctrl=pelicula&id=0221889 http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters 

В это (я положил слово «материал», но это действительно должно быть чем-то, что описывает то, что вы, вероятно, найдете, то есть «магазин» или «библиотека» или что-то еще такое содержимое):

 http://website.com/stuff/pelicula/0221889/ http://website.com/stuff/pelicula/0221889/posters/ 

Для этого вы должны поместить файл .htaccess в папку верхнего уровня вашего сайта, которая содержит следующие правила:

 RewriteEngine on RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L,NC,QSA] RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA] 

Имея «составную» часть адреса (переименованную в нечто подходящее), вы не будете случайно переписывать другие активы, такие как изображения, включая CSS и JavaScript.

В качестве примечания вы упомянули:

Это также не работает. Это приведет меня к моей странице 404.php по умолчанию.

Где объявлено ваше перенаправление 404 ошибок?

RewriteRule ^ stuff /([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 & tab = $ 3 [L, NC , QSA] RewriteRule ^ stuff /([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 [L, NC, QSA]