Как я могу создавать удобные 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/

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: основываясь на некоторых ответах, которые я получаю здесь, я помещаю это:

<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 включен и работает.

Помогите!

Author: Undo, 2010-06-13

8 answers

В корневом каталоге документа для 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];
 6
Author: Richard JP Le Guen, 2010-06-13 18:49:40

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

<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 для добавления или удаления завершающей косой черты по мере необходимости.

 7
Author: cam8001, 2010-06-18 00:27:33

Первый, предполагающий, что ваш файл .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, чтобы переписать разницу между вкладкой и статьей или исключить тире из регулярного выражения.

 0
Author: , 2010-06-13 18:46:22

Чтобы иметь этот 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>

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

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

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

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

 0
Author: jfoucher, 2010-06-13 21:21:07

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

 0
Author: user371788, 2010-06-21 02:07:22

Я использую это в своем .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

 0
Author: Kristoffer Sall-Storgaard, 2010-06-21 08:55:13

Основываясь на опыте, я бы рекомендовал скорректировать вашу схему 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?

 0
Author: user75525, 2010-06-22 07:26:01

Переписать ^материал/([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L, NC,QSA] Переписывать ^материал/([^/.]+)/([^/.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA]