Как я могу создать дружественные URL с помощью .htaccess? - PullRequest
11 голосов
/ 13 июня 2010

У меня проблемы с .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

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

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

Помощь!

Ответы [ 8 ]

7 голосов
/ 18 июня 2010

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

<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 голосов
/ 13 июня 2010

В корне документа для 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];
0 голосов

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

0 голосов
/ 22 июня 2010

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

Преобразовать это:

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

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

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 голосов
/ 21 июня 2010

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

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

0 голосов
/ 14 июня 2010

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

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

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

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

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

0 голосов
/ 13 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...