2015-09-08 2 views
0

У меня возникли проблемы с пониманием этого файла .htaccess, который я унаследовал при своем новом задании. Я - разработчик графического дизайнера/маркетолога. На нашем сайте есть куча ошибок дублирования, и я хочу переименовать наши ссылки и перенаправить их 301.301 перенаправление динамических cgi сгенерированных URL-адресов с использованием .htaccess

Это первая часть файла .htaccess:

RewriteEngine Off 

RewriteCond %{HTTP_HOST} !^blog.asseenontvhot10.com$ [NC] 
RewriteCond %{REQUEST_URI} !/sitemap\.xml 

AddType text/html .shtml, .html, .htm 


AddHandler server-parsed .shtml, .html, .htm 
AddHandler application/x-httpd-php5 .html .htm .shtml 
#Options FollowSymLinks Includes -Indexes 

Из того, что я понимаю, что первая часть связывает наш блог на основной сайт, и я не уверен, что делает следующая строка. Линия addtype и те, которые следуют, позволяют .htaccess читать/записывать эти типы файлов?

Вот та часть, я считаю уместным и то, что мне нужно изменить:

RewriteEngine on 

rewritecond %{http_host} ^[^.]+\.[^.]+$ [nc] 
rewriterule ^(.*)$ http://www.%{http_host}/$1 [r=301,nc] 
RewriteRule default.html /home.html 
RewriteRule contact\.html /cgi-bin/commerce.cgi?display=contact 
RewriteRule about\.html /cgi-bin/commerce.cgi?display=about 
RewriteRule register\.html /cgi-bin/commerce.cgi?register=action 
RewriteRule products\.html /cgi-bin/commerce.cgi?listcategories 
RewriteRule parent_category/(.*)/(.*)/ /cgi-bin/commerce.cgi?listcategories=action&parent=$1 
RewriteRule category/(.*)/(.*)/(.*)\.html /cgi-bin/commerce.cgi?search=action&category=$1&page=$3 
RewriteRule category/(.*)/(.*)/ /cgi-bin/commerce.cgi?search=action&category=$1 
RewriteRule category/(.*).html /cgi-bin/commerce.cgi?search=action&page=$1 
RewriteRule product/(.*)/(.*)/ /cgi-bin/commerce.cgi?preadd=action&key=$1 
RewriteRule basket\.html /cgi-bin/commerce.cgi?display=basket 
RewriteRule log-in\.html /cgi-bin/commerce.cgi?login 
RewriteRule home\.html /cgi-bin/commerce.cgi?display=home 
RewriteRule search\.html /cgi-bin/commerce.cgi?display=search 
RewriteRule all-items\.html /cgi-bin/commerce.cgi?search 
RewriteRule update_user\.html /cgi-bin/commerce.cgi?displayuser=action 
RewriteRule order_history\.html /cgi-bin/commerce.cgi?orderhistory 
RewriteRule logout\.html /cgi-bin/commerce.cgi?logout 
RewriteRule specials\.html /cgi-bin/commerce.cgi?search=action&keywords=nav_specials 

Я знаю, что первая часть сил WWW. и перенаправляет 301, хотя я не видел этого способа выполнить его в любом руководстве, которое я прочитал. Первое, что мне действительно нужно изменить делает домашнюю страницу 301 перенаправление с: http://www.asseenontvhot10.com/cgi-bin/commerce.cgi?display=home в http://www.asseenontvhot10.com/

Насколько я могу сказать RewriteRule делает этот вариант, но dosn't заставить его. Будет ли добавлено [r = 301] к концу работы перезаписывания? Я также прочитал, что есть код, который нужно добавить для .cgi, чтобы работать как .php, но я полностью потерялся там.


Update: Я попытался добавить эту строку в нижней части -

Redirect 301 /cgi-bin/commerce.cgi?display=home/

, и я получил ошибку 500.


второе обновление: Я добавил этот код:

RewriteRule about\.html /cgi-bin/commerce.cgi?display=about 
RewriteCond %{QUERY_STRING} ^display=about$ 
RewriteRule ^cgi-bin/commerce\.cgi$ /about [R=301] 

И 404'd. Когда я заменил файл .htaccess резервной копией и страницей еще 404 ... Теперь я действительно в недоумении и не знаю, как вернуть сайт. Я даже не знаю, где перенаправление будет храниться вне файла htaccess после его возврата.


третье обновление: (делая прогресс) Я добавил этот код:

RewriteRule about\.html /cgi-bin/commerce.cgi?display=about 
RewriteCond %{QUERY_STRING} ^display=about$ 
RewriteRule ^cgi-bin/commerce\.cgi$ /about\.html? [R=301] 

, и я получил цикл перенаправления. Это было, наконец, перенаправление на about.html, который я думал, что первое правило переименовано в /cgi-bin/commerce.cgi?display=about, но оно перенаправлено на него снова и снова.

+0

'Добавить *' не имеет ничего общего с переписыванием. это просто говорит apache, какие типы определенных расширений файлов. например 'AddType text/html .exe' позволит вам называть ваши .html-файлы как .exe вместо этого, и они будут обрабатываться как html, а не исполняемые файлы. –

+0

и '[r = 301]' просто сообщает движку rewrite выполнить переадресацию на стороне клиента, а не просто перезаписывать на сервере –

+0

Итак, мое правило типа добавления сообщает серверу, чтобы он служил .html-файлам в виде .shtml. html или .htm? Есть ли причина для этого, например, совместимость с Mac? Что касается перенаправления, добавив [r = 301] в конец правила, чтобы браузеры и поисковые роботы перенаправляли ссылки cgi на чистую ссылку? –

ответ

0

Директива Redirect в Apache требует, чтобы адресат перенаправления был полностью квалифицированным URL со схемой и URL-адресом.Так что это будет работать:

Redirect 301 /cgi-bin/commerce.cgi http://www.yourdomain.com/ 

Однако, я не верю, что Redirect может проверить строку запроса, поэтому для того, чтобы только применить это перенаправление, если строка запроса «дисплей = дом» вы, вероятно, придется использовать mod_rewrite, как это:

RewriteCond %{QUERY_STRING} ^display=home$ 
RewriteRule ^cgi-bin/commerce\.cgi$/[R=301] 

The RewriteCond проверяет, что строка запроса точно равно «дисплей = дом» и RewriteRule будет срабатывать только если это условие выполнено. И в RewriteRule флаг [R=301] указывает mod_rewrite на перенаправление веб-браузера посетителя на целевой путь, / в этом случае.

Кстати, глядя на существующие условия в файле .htaccess, я не вижу, как ваши пользователи видят путь /cgi-bin/commerce.cgi в своем веб-браузере. Все эти директивы RewriteRule предназначены для бесшумной перезаписи. Это означает, что пользователь будет продолжать видеть «дружественный» URL-адрес в своем веб-браузере, но в фоновом режиме Apache фактически найдет файл, расположенный по пути /cgi-bin/commerce.cgi, и вернет содержимое или результат этого файла для пользователя. Поэтому ваши пользователи должны уже видеть дружественную версию URL. Если то, что вы пытаетесь сделать вместо этого, просто переписать запрос на «/» (корень сайта), чтобы Apache молча переписывал путь и фактически извлекал содержимое в реальном файле /cgi-bin/commerce.cgi?display=home, тогда вы, вероятно, хотите вместо этого:

RewriteRule ^$ /cgi-bin/commerce.cgi?display=home 

Это соответствует только запрос корневого каталога (без имени файла, указанного) и будет молча получать и возвращать содержимое, которое возникает в результате вызова файла commerce.cgi с «дисплеем = home ".

+0

Я добавил этот код: 'RewriteRule о \ .html /cgi-bin/commerce.cgi дисплей = about' ' RewriteCond% {QUERY_STRING}^дисплей = около $ '' RewriteRule^CGI-BIN/коммерция \ .cgi $ /about\.html? [R = 301] ' и я получил цикл перенаправления. Это было, наконец, перенаправление на about.html, который я думал, что первое правило переименовано в /cgi-bin/commerce.cgi?display=about, но оно перенаправлено на него снова и снова. –

+0

Директивы mod_rewrite применяются к каждому запросу, в том числе к перезаписанным запросам. Таким образом, Apache переписывает A как B, а также B, поскольку A вызовет бесконечный цикл. Я не рекомендую перенаправлять пользователя, если он запрашивает реальный URL. Вместо этого просто добавьте элемент [canonical link] (http://googlewebmastercentral.blogspot.co.uk/2009/02/specify-your-canonical.html) на ваши HTML-страницы, чтобы поисковые системы, такие как Google, знали, что это еще один способ найти тот же ресурс. – Bobulous

+0

Это то, что я делаю в этом файле? Я просто хочу, чтобы '/cgi-bin/commerce.cgi? Display = about' перенаправлялся на /about.html То же самое касается категорий и дома. –

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