Мне тяжело работать с .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]