2013-05-17 4 views
0

У меня есть URL-адрес, как это:Почему этот .htaccess не работает?

http://domain.com/index.php?id=223 

И этот .htaccess код:

RewriteEngine On 
RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L] 

Из того, что я понимаю, это должен вывести:

http://domain.com/223.html 

Но это не делает ничего, может кто-нибудь объяснить, как это работает и что я делаю неправильно?

+0

Прежде всего, вы уверены, что на сервере установлен mod_rewrite (при условии, что ubuntu, с терминала вы делаете 'sudo a2enmod rewrite') – dave

+0

Заработал и перезапустил Apache. Я также пробовал это на размещенном сервере. – afro360

+0

Эти параметры для 'RewriteRule' выглядят неверно. Вы помещаете тот, который вы поймаете первым, и тот, который вы перенаправляете ко второму. – Greg

ответ

0

Ваше исходное правило принимает любой файл, который не содержит косой черты и заканчивается символом «.html» на корневом уровне (включая файл с именем «.html») и перенаправляет запрос в файл index.php, и он берет первую часть имени файла из запроса (перед точкой) и передает его как запрос под названием «id».

RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L] 

Поскольку это .htaccess вы должны принять косую черту от

Вы должны сделать это:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)\.html$ /index.php?id=$1 [L] 

В самой вашей HTML в ссылках, вам нужно вызвать имя файла. HTML.

<a href='/223.html'>Some page with an id of 223</a> 

Для SEO вы можете принять матч начать

RewriteRule ([^/]+)\.html$ /index.php?id=$1 [L] 

Это сделало бы, чтобы вы могли ссылаться на файл, например:

/somedirectory/someseotitle/223.html 

Кроме того, вы должны затем создать 301 перенаправляет из все ссылки id=$id и заставить их перейти к намеченным целям с полным URL-адресом. Код, приведенный ниже, войдет в файл index.php вверху до того, как будут установлены cookies или начнется sessions. В качестве примера того, что вы могли бы сделать ... Я только догадываться о структуре таблицы:

<?php 

if ($_SERVER['REQUEST_URI']=='/index.php' && !empty($_GET['id']){ 
    if (is_numeric($_GET['id'])){ 
     $id = $_GET['id']; 

     $cquery = "select count(*) from table where id = $id"; 
     $count = mysqli_result(mysqli_query($cquery),0); 
     if($count == 1){ 
      $tquery = "select title from table where id = $id"; 
      $result = mysqli_query($tquery); 
      while ($row=mysqli_fetch_array($result)){ 
       $title = urlencode($row['title']); 

       $headerString = "Location: /$title/$id.html"; 

       header("HTTP/1.1 301 Moved Permanently"); 
       header($headerString); 

      } 
     } 

    } 
} 

?> 
+0

Итак, это работает на моей учетной записи хостинга, но не на моем локальном сервере LAMP. У меня есть URL-адрес, например http: //localhost/myfolder/index.php? Id = 90 и не работает. – afro360

+0

Вам нужно включить модуль mod_rewrite в файле httpd.conf. Обычно линия уже существует, вам просто нужно раскомментировать ее. –

+0

php почти идентичен тому, что у меня уже есть, кроме 301 переадресации. Я пытаюсь отредактировать файл httpd.conf. – afro360

0

В дополнение к тому, что у вас уже есть в файле .htaccess вам понадобится правило для внешнего перенаправления /index.php?id=223 в /223.html. Это должно быть ваше полное .htaccess:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(?:index\.php|)\?id=([^&\s]+) [NC] 
RewriteRule^/%1.html? [R=302,L] 

RewriteRule ^([^.]+)\.html$ /index.php?id=$1 [L,QSA,NC] 

После того, как вы убедитесь, что он работает нормально, замените R=302 на R=301. Избегайте использования R=301 (Постоянный переадресация) при тестировании ваших правил mod_rewrite.

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