Правило Apache mod_rewrite не работает для разных страниц - PullRequest
1 голос
/ 16 августа 2011

У меня есть правило перезаписи на apache2 в файле .htaccess, которое отлично работает для страницы posts.php.

mysite.com/post.php?id_name=this-is-the-title-of-my-site 

становится

mysite.com/this-is-the-title-of-my-site

Я хочу использовать то же правило для страницы cats.php, чтобы

mysite.com/cats.php?cat_label=articles

становится

mysite.com/articles

Я использовал то же правило и изменил имя файла и параметры, но, похоже, правило для страницы cats.php не работает и переопределяется правилом posts.php

Я бы предпочел не делать этого, но я не против изменить структуру, чтобы она стала

mysite.com/cats/articles

Это файл .htaccess, который я сейчас использую

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id_name=$1 [L,QSA]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ cats.php?cat_label=$1 [L,QSA]

Вся помощь очень ценится

1 Ответ

1 голос
/ 16 августа 2011

Флаг [L] означает «Последний», т. Е. Когда это правило соответствует, это последнее проверенное правило перезаписи.Вам нужен способ различать два типа перенаправлений.Вот два способа сделать это:

(1) Поставить тире во всех именах ваших сообщений, но не в категориях, поэтому оба приведенных вами примера работают так, как указано:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^-]+)$ cats.php?cat_label=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id_name=$1 [L,QSA]

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

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^cats/(.*)$ cats.php?cat_label=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id_name=$1 [L,QSA]

В обоих случаях мы сначала сопоставляем более конкретные версии, помечая их как [L] ast.Тогда у нас есть широкая, запоминающаяся в конце.

...