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

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

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

На помощь!

11
задан Undo 14 December 2013 в 01:19
поделиться

7 ответов

В корне документа для http: // веб-сайта.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];
7
ответ дан 3 December 2019 в 08:28
поделиться

Первый предполагает, что ваш файл .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

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

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

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

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

0
ответ дан 3 December 2019 в 08:28
поделиться

Чтобы этот 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
ответ дан 3 December 2019 в 08:28
поделиться

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

0
ответ дан 3 December 2019 в 08:28
поделиться

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

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

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

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

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
ответ дан 3 December 2019 в 08:28
поделиться

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

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

Обычно, если он не существует в виде файла или каталога, используйте перезапись.php, и пусть он позаботится о разборе URL-адресов и т. д. Это, я считаю, самый простой способ переписать.

Также просмотрите результаты var_dump ($ _ SERVER) (где-то, как вы знаете, работает), чтобы узнать, действительно ли то, что вы считаете самым верхним каталогом, ЯВЛЯЕТСЯ самым верхним каталогом, например: вы можете писать в /var/www/domain/www/index.php вместо /var/www/domain/index.php

0
ответ дан 3 December 2019 в 08:28
поделиться

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

<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
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: