Несколько модов переписывает в .htaccess - PullRequest
0 голосов
/ 29 декабря 2010

Мне нужны следующие правила, но, похоже, я не получаю правильную настройку.

<domain>/training-courses/

как с косой чертой, так и без нее, в конце которой она должна идти:

<domain>/?index.php?page=training-courses

и для каждой дополнительной переменной после этого я хочу, чтобы она вела себя так:

<domain>/training-courses/success/another-value/and-yet-another/

до

<domain>/?index.php?page=training-courses&val1=success&val2=another-value&val3=and-yet-another-value

Если не возможно иметь опцию для неограниченных ведущих переменных, я хотел бы иметь по крайней мере 2 переменные после переменной страницы

Возможно ли это?и как мне разобраться с этим?

У меня так далеко:

RewriteEngine On

RewriteRule ^test/([^/]*)/$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)$ /test/index.php?pagina=$1&val1=$2

RewriteRule ^test/([^/]*)/([^/]*)/$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)/([^/]*)$ /test/index.php?pagina=$1&val1=$2

RewriteRule ^test/([^/]*)/([^/]*)/([^/]*)/$ /test/index.php?pagina=$1&val1=$2&val2=$3
RewriteRule ^test/([^/]*)/([^/]*)/([^/]*)$ /test/index.php?pagina=$1&val1=$2&val2=$3

Ответы [ 3 ]

0 голосов
/ 29 декабря 2010

После нескольких часов борьбы это просто не сработает. Поскольку неограниченные переменные просто не поддерживаются, я согласен с двумя переменными, кроме страницы (pagina). Теперь у меня есть вот что:

RewriteEngine On

RewriteRule ^(test/images|test/css|test/js|test/lib)($|/) - [L]

RewriteRule ^test/(.*)/(.*)/(.*)/ test/index.php?pagina=$1&e=$2&t=$3
RewriteRule ^test/(.*)/(.*)/(.*) test/index.php?pagina=$1&e=$2&t=$3
RewriteRule ^test/(.*)/(.*)/ test/index.php?pagina=$1&e=$2
RewriteRule ^test/(.*)/(.*) test/index.php?pagina=$1&e=$2
RewriteRule ^test/(.*)/ test/index.php?pagina=$1
RewriteRule ^test/(.*) test/index.php?pagina=$1

Нет из RewriteRules работает, за исключением первого, которое исключает папки из других перезаписывающих файлов. Работая, я имею в виду, что он будет фактически перенаправлять URL-адреса в index.php, но я не могу получить значения в PHP через, например, $ _GET ['pagina']

Странно, но это БУДЕТ работать, хотя мне это слишком ограничено:

RewriteEngine On

RewriteRule ^(test/images|test/css|test/js|test/lib)($|/) - [L]

RewriteRule ^test/(.*)/ test/index.php?pagina=$1
0 голосов
/ 08 мая 2011

Я хотел бы вернуться к своему собственному вопросу и ответить на него.Некоторое время сейчас я использую именно то, что хочу.

Прежде всего, у меня есть это в моем htaccess:

<IfModule mod_rewrite.c>

    RewriteEngine On

    # existing folders or files
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.* - [L]

    # non-existing folders or files
    RewriteRule ^(.*)/? index.php?p=$1 [L]

</IfModule>

Это позволяет получить доступ к реальным файлам в любое время.Если путь не существует, он передаст весь путь к index.php.

В index.php у меня есть следующий код вверху:

// Split the URL in all its components
$request = parse_url(strip_tags($_GET['p']));
// Only take the path without any leading slashes
$path = rtrim($request['path'], '/');
// Split each variable from eachother
$path_array = explode("/", $path);

if(count($path_array)){
    // By default I select the first variable as the page I will include later on
    $page = $path_array[0];

    // Each other variable I will pass as $val[#nr] starting with 1. Just to be sure I'm going to strip tags and slashes
    for($i=1;$i<count($path_array);$i++){
        $path_array[$i] = strip_tags($path_array[$i]);
        $path_array[$i] = stripslashes($path_array[$i]);
        $val[$i] = $path_array[$i];
    }
}
else{
    // If $path_array doesn't contain multiple variables lets assume $path will contain the $page
    $page = $path; 
}

// If $page is empty let's take on the default page to include later on
if(empty($page)){
    $page = "home";
}

if(file_exists($page . ".php")){
    include($page . ".php");
}
else{
    echo "Page " . $page . ".php does not exist.";
}

Чтобы дать вам несколько примеровиз возможностей:

domain.com / будет включать home.php domain.com/product/ будет включать product.php domain.com/product/298833/ будет включать product.php и анализировать 298833 как $ val [1];domain.com/product/298833/purple-candle будет включать product.php и анализировать 298833 как $ val [1];и пурпурная свеча как $ val [2];Обратите внимание, что ведущий слеш не включен.Это не имеет значения.

Я открыт для улучшений или советов в целом.На данный момент это определенно тот ответ, который я искал в ответ, когда задавал этот вопрос.

0 голосов
/ 29 декабря 2010

Вы совершенно правы, вы не можете обрабатывать неограниченные переменные как подпапки так, как вам хотелось бы, mod_rewrite просто не поддерживает это.

Однако, в ответ на вашу первую проблему, чтобы сделать трейлинг / опциональным, измените ваши правила на следующие:

RewriteRule ^test/([^/]*)/?$ /test/index.php?pagina=$1

RewriteRule ^test/([^/]*)/([^/]*)/?$ /test/index.php?pagina=$1&val1=$2

RewriteRule ^test/([^/]*)/([^/]*)/([^/]*)/?$ /test/index.php?pagina=$1&val1=$2&val2=$3
...