Как я могу создавать удобные 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 включен и работает.
Помогите!
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];
Просто протестировал это локально, и, похоже, это делает то, что вам нужно:
<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>
Вот что он делает:
- Для такого пути, как http://website.com/pelicula /, перенаправление на /index.php?ctrl=пеликула
- Для такого пути, как http://website.com/pelicula/0221889 , перенаправить на /index.php?ctrl=pelicula&id=0221889
- Для такого пути, как http://website.com/pelicula/0221889/posters /, перенаправить на /index.php?ctrl=пеликула и вкладка=плакаты
- Для путь, подобный http://website.com/pelicula/0221889/posters/anything-can-go-here , перенаправить на /index.php?ctrl=pelicula&tab=плакаты и игнорировать остальную часть пути.
Эти перезаписи будут работать с завершающей косой чертой или без нее - если вы хотите, чтобы они работали только без косой черты, удалите (?:/)?
из конца первых двух перезаписей. Вы также можете использовать 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>
Вам нужно выбрать, хотите ли вы поместить заголовок после идентификатора и делать это все время, потому что переменная tab находится на последней позиции: вы должны знать, будет ли это номер 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?
Переписать ^материал/([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L, NC,QSA] Переписывать ^материал/([^/.]+)/([^/.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA]