2014-10-20 2 views
0

Попытка этого снова, потому что я понимаю, как очень плохо я сформулировал свой оригинальный пост.301 htaccess Перенаправление, которое заставит?

У меня есть страница Product1.php, которая является динамической для заполнения моих продуктов из базы данных.

Это рубрика моего SEO-дружественных URL:

http://www.example/category/subcategory/model_name-model_id/product_id 

Это оригинальный URL со строкой запроса, он переписывает в:

http://www.example.com/Product1.php?=Product_ID=1 

Это функция переписывает я имею в Htaccess, что делает это произошло:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^category/.*/.*/([0-9]+)$ Product1.php?Product_ID=$1 [L,QSA] 

Однако, если пользователь вручную типа в http://www.example.com/Product1.php?=Product_ID=1 в адресной строке, это та, которую они все еще видят. Более того, это то же самое для ботов поисковой системы, которые делят ценность моих страниц.

Как написать 301 переадресацию, которая будет заставить пользователя и бота видеть URL-адрес, ориентированный на SEO, только, независимо от того, как они получают доступ к странице? Я исследовал дни и различные решения, которые я пробовал, дал мне всего 404 или 500 ошибок.

Пожалуйста, помогите. Заранее спасибо.

** EDIT: ОК, похоже, что я не могу вызвать RewriteMap, потому что у меня нет доступа к конфигурационным файлам моего хоста. (Необходимо обновить нашу учетную запись, чтобы сделать это, и работодатель не желает.) Таким образом, вам нужно будет сделать правило перезаписи для каждой отдельной страницы, что является неудачным, но выполнимым.

Но все же необходимо выяснить, как заставить перенаправление вызывать ошибки 404 или 500. Кто угодно?

+1

Ваш код никогда не должен выводить недружественные URL-адреса в первую очередь. 'Product1.php? ....' уродливые должны быть чисто ВНУТРЕННИЙ, существующий только на уровне mod_rewrite. Любые ссылки, которые вы выведете из PHP для пользователя, для просмотра, должны всегда быть seo-friendly версиями. Если пользователь знает вашу систему достаточно хорошо, чтобы понять, что такое «настоящий» URL-адрес из версии seo, у вас, вероятно, есть больше проблем, чем просто наличие уродливых URL-адресов. –

+0

Marc B: Прежде всего, я полностью осознаю это.Однако я унаследовал сайт от предыдущего разработчика, который не знал SEO от ОПЕК. Я в настоящее время в процессе уничтожения всех ее урона, который был значительным. Во-вторых, можете ли вы, возможно, взломать ответ на мой вопрос? Спасибо – user3569292

+0

, вы не будете делать это легко на уровне mod_rewrite. в то время как вы можете тривиально обнаружить, что кто-то входит с URL-адресом '/Product1.php? ....', вам понадобится специальное правило для ** EVERY ** id, чтобы вы могли перенаправить на правильный '/ category/subcat 'или используйте карту перезаписи для поиска значений. –

ответ

0

Я использовал небольшой трюк, добавляя параметр «Внутренний» к правилу, ответственному за основную перезапись, и проверку этого параметра в 301 переадресации. Решение с переменными среды также позволяет обрабатывать запросы, где параметры могут быть представлены в любом порядке.

RewriteEngine on 

# perform collecting parameters from query string to an environment variables 

RewriteCond %{QUERY_STRING} Category=([^&]+) 
RewriteRule . - [E=category:%1] 

RewriteCond %{QUERY_STRING} SubCategory=([^&]+) 
RewriteRule . - [E=subcategory:%1] 

RewriteCond %{QUERY_STRING} Product_ID=([^&]+) 
RewriteRule . - [E=productid:%1] 

#...etc... 

# give a right 301 redirect 
RewriteCond %{REQUEST_URI} Product1.php 
# make sure it's not an internal redirect 
RewriteCond %{QUERY_STRING} !^Internal=1(.*)$ 
RewriteRule . /%{ENV:category}/%{ENV:subcategory}/%{ENV:productid}/? [L,R=301] 

# now rewrite rule with the additional "Internal" parameter to label it as an internal redirect 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ([^/]+)/([^/]+)/([^/]+) 
RewriteRule .* Product1.php?Internal=1&Category=%1&SubCategory=%2&Product_ID=%3 [L] 

Таким образом, следующий запрос

/Products1.php?Category=cat1&SubCategory=subcat1&Product_ID=321 

приведет к 301 перенаправления

/cat1/subcat1/321/ 

и соответствующая страница будет отображаться.

Еще один способ - удалить «внутренний» трюк и использовать другое имя скрипта, например, Product2.php. То есть вам нужно что-то отличить внешний запрос от внутренней перезаписи. чтобы избежать бесконечного цикла (ошибка «слишком много перенаправлений»).

Смежные вопросы