Мне приходится нелегко с .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 включен и работа.
На помощь!
В корне документа для 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];
Первый предполагает, что ваш файл .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 будет работать с завершающей косой чертой или без нее.
Что касается другого, я бы, вероятно, всегда держал статью в конце, чтобы переписать или добавить еще / значение
, чтобы при перезаписи была видна разница между табуляцией и статьей, или исключить тире из регулярного выражения.
Чтобы этот 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]
третья скобка не будет захвачена и, следовательно, может содержать что угодно.
Надеюсь, что это поможет
Убедитесь, что у вас нет другого файла .htaccess выше в дереве каталогов, который конфликтует с файлом .htaccess вашего сайта.
Исходя из опыта, я бы порекомендовал скорректировать вашу схему 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?
Я использую это в моем файле .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
Только что протестировал это локально и, кажется, он делает то, что вам нужно:
<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 для добавления или удаления слеша, если это необходимо.