2013-05-28 2 views
0

У меня есть веб-сайт, который не использует дружественные URL-адреса, и я хотел бы его изменить. Мои ссылки до сих пор таковы: http://www.example.com/?l=EN&m=o36ASkkEVi, где переменная l содержит язык просмотра, а m содержит категорию просмотра (меню). Поскольку идентификатор элемента меню уникален, у меня пока не было проблем, даже если это был элемент подменю. Но теперь, когда я пытаюсь изменить его на дружественные URL-адреса, у меня возникает следующая проблема:.htaccess Дружественный URL-адрес предотвращает перенаправление

Во-первых, дружественное название элемента меню не уникально, поскольку (по крайней мере, в моем проекте) могут быть несколько элементов подменю (категории) в разных пунктах главного меню с тем же названием. Например, оба пункта меню Camera и Mobile Phone оба имеют подменю Instructions. Поэтому моя цель заключается в том, чтобы окончательный дружеский URL был чем-то вроде http://www.example.com/EN/Mobile-Phone/Instructions и http://www.example.com/EN/Camera/Instructions.

Во-вторых, «глубина» меню не предопределена. Таким образом, могут быть неограниченные подкатегории категории (меню).

В прошлом для небольших сайтов я использовал статические перезаписи htaccess (одно правило для каждого перенаправления), но прямо сейчас, когда статьи и категории несчетны, я не могу сделать то же самое. Я думал о переписывании файла .htaccess для каждой статьи или создания и редактирования меню, чтобы иметь правило для каждого случая, но я думаю, после некоторого момента, который сделает огромный .htaccess. Является ли это решение законным?

Мой вопрос так и есть. Как я могу сделать правило в .htaccess, чтобы всегда отправлять меня в index.php вместо того, чтобы пытаться найти подпапку веб-сайта, когда я пишу http://www.example.com/EN/Camera/Instructions, но с тем, чтобы URL-адрес был «видимым» для PHP?

Я знаю, что после этого я смогу использовать explode('/', $_SERVER['REQUEST_URI']) и достичь своей цели, выбрав из базы данных правильный язык и статью или меню, но я не могу или не могу найти способ, как сделать первую часть.

Кроме того, есть ли способ, что .htaccess может получить мне все предметы после http://www.example.com/ в чем-то вроде массива и передать его как переменные в index.php?

ответ

1

с этим кодом в вашем .htaccess, он посылает все в index.php, где $ 1 ваши переменные

RewriteRule ^(.*)$ index.php?path=$1 [L] 

это тоже интересно:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

всякий раз, когда он находит папку или файл, он не направить его на index.php

+0

Спасибо Петр! :) Я уже попробую! –

0

Я использую ту же самую систему для своих сайтов. Вот мой .htaccess:

RewriteEngine on 
Options +FollowSymLinks 

# Redirect all valid requests to the engine or a valid file 
RewriteBase/
RewriteRule !data/|javascript/|templates/|\.(js|ico|gif|jpg|png|css|swf)$ index.php [NC] 

Вот мой web.config (IIS)

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="Rewrite rules"> 
        <match url="data/|javascript/|templates/|\.(js|ico|gif|jpg|png|css|swf)$" negate="true" /> 
        <action type="Rewrite" url="index.php" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

И я прочитал путь от PHP, как это, я разорвал его от моего ввода классовой структуры, но вы получите основную идею:

/** 
    * Parse the current url string. This overrides the parent::parse(); 
    * 
    */ 
    protected function parse($stripExtensions = "html,htm,xml") 
    { 
    $values = array(); 
    $regexp = '/(\.' . implode('|\.', $stripExtensions) . ')$/i'; 

    list($url) = explode('?', $_SERVER['REQUEST_URI']); 

    // Strip trailing slash and allowed extensions 
    if ($url{strlen($url)-1} == '/') { 
     $url = substr($url, 0, strlen($url)-1); 
     $this->extension = '/'; 
    } else { 
     $matches = array(); 
     preg_match($regexp, $url, $matches); 
     if (count($matches) > 1) $this->extension = $matches[1]; 
     $url = preg_replace($regexp, '', $url); 
    } 

    $variables = explode('/', $url); 
    array_shift($variables); // First one is always empty 
    $i = 0; 
    foreach($variables as $v) { 
     $values[$i++] = urldecode($v); 
    } 
    return $values; 
    } 
+0

Очень интересно, спасибо! –

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