2

Пробовал самостоятельно разобраться, но не повезло.URL rewrite (routing), mod_rewrite или PHP

У меня есть веб-сайт (PHP, Apache), со следующей структурой, в качестве образца:

1. http://hostname/ 
2. http://hostname/category?list=listname 
3. http://hostname/product?id=...&name=productname 
4. http://hostname/recipes 
5. http://hostname/recipe?id=...&name=recipename 

+ many others. 

Текущий .htaccess является:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

Так примеры http://hostname/category?list= ... становится /category.php?list ... И затем он ловит скрипт php и работает.

Я хочу, чтобы дружественные URL, как эти:

1. http://hostname/ 
2. http://hostname/category/listname/ 
3. http://hostname/product/productname/ 
4. http://hostname/recipes/ 
5. http://hostname/recipe/recipename/ 

А с другой стороны, предыдущие URLs должно работать, как Webiste является чрезвычайно индексируются поисковыми enginges. Поэтому из URL-адресов oldstyle необходимо 301 перенаправить на новые URL-адреса. Любые идеи? У всех моих усилий были ошибки. Я даже пытался сделать PHP-маршрутизацию через точку входа index.php, но я не могу понять, как обращаться со старыми ссылками.

ответ

1

Во-первых, отключите multiviews, если он включен. Попробуйте следующие правила для того, чтобы 301 redrects на новый адрес структуры:

RewriteEngine On 
RewriteCond %{THE_REQUEST} ^GET\ /(category|product|recipe)(?:\.php)?\?.*(name|list)=([^&\s]+) [NC] 
RewriteRule^/%1/%3/? [R=301,L,NC] 

Как для местных/внутренниха переадресовывает обратно на реальные страницы, которые должны были бы быть рассмотрены в индивидуальном порядке:

RewriteRule ^(category)/([^/]+)/?$ /$1.php?list=$2 [NC,L] 
RewriteRule ^(recipe|product)/([^/]+)/?$ /$1.php?name=$2 [NC,L] 
RewriteRule ^(recipe)/?$ /$1.php [NC,L] 
+0

Спасибо за Помогите. 'RewriteCond% {THE_REQUEST}^GET \ (категория | продукт | рецепт) (?: \. Php)? \?. * (Name | list) = ([^ & \ s] +) [NC]' работает только без^GET \. не могут отключить мультивизы, настройки хостинга не позволяют это делать. все остальное работает так, как полагают. Что делает [NC] и [L] в этих случаях? – Zergius2

+1

'NC' означает сопоставление капитальных/малогабаритных букв. 'L' означает, что они не обрабатывают дальнейшие правила. Подробнее о флагах здесь: https://devdocs.io/apache_http_server/rewrite/flags @ Zergius2 Я пропустил ведущий '/' в этом 'RewriteCond'. – hjpotter92