2016-01-24 2 views
2

Я хотел бы перенаправить URL-адреса, которые не входят в каталоги для одного скрипта (например, script1.php) и URL-адреса, которые имеют категории для другого скрипта (script2.php). В основном я хотел бы сделать что-то вроде этого: http://www.test.com/user1 ->http://www.test.com/script1.php?username=user1 где script1.php получает имя пользователя и представляет соответствующую страницу для этого пользователя. У меня есть та часть работы с этим кодом:Обработать .htaccess перенаправляет с различными параметрами?

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

Сейчас проблема заключается в том, что я хотел бы иметь описательные URLs продукта, так что, например http://www.test.com/clothes/jackets/cool-red-jacket-25 перенаправляет на http://www.test.com/items.php?category=clothes&subcategory=jackets&id=25. У меня есть некоторый код, который должен работать для этого тоже:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/?([a-zA-Z-]+)/([a-zA-Z-]+)/.*-A([0-9-.]+)\.php$ 
script2.php?category=$1&subcategory=$2&id=$3 [L] 

Проблема у меня комбинирует эти 2 вида переадресации. Первая переадресация всегда перенаправляется на собственную страницу, и второе перенаправление никогда не будет достигнуто. Можно ли объединить эти 2 и каким образом? В принципе мне нужно что-то подобное для HTAccess, если это возможно

if(!urlHasDirectories) { 
    redirect to script1.php?username=$username; 
} else { 
    redirect to script2.php?category=$category&subcategory=subcategory&id=$id; 
} 

ответ

3

отпустит над основным regexs, мы будем использовать Regex101 для этого. . - любой символ, а * - это квантификатор предыдущего символа/группировки ноль или более раз. Итак, ваше первое регулярное выражение, RewriteRule ^(.*)$ script1.php?username=$1 [L,QSA] говорит, переписывает все, что начинается с чего угодно и заканчивается чем угодно, scripts1.php. Это не то, что вы хотите.

Демо: https://regex101.com/r/hK0xY3/1

С regexs лучше быть как можно более конкретным.

Я хотел бы сделать ваше правило для пользователей:

RewriteRule ^(user\d+)$ script1.php?username=$1 [L,QSA] 

Демо: https://regex101.com/r/hK0xY3/4

+ еще один квантор здесь означает один или несколько, чтобы вы могли изменить что к * если число INS' t требуется.

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

^.+?\/ 

Демо: https://regex101.com/r/hK0xY3/3

При таком подходе, хотя запрос любой каталог будет перенаправлен ...

+1

Chris $ 1 означает значение первого захвата gruop, но $ 1 не определено в вашем правиле. – starkeen

+1

@Starkeen О, да, забыл реализовать это, было больше демонстрацией регулярных выражений. Я буду обновлять, спасибо. – chris85

+0

@ chris85 Это то, что я искал! Спасибо за объяснение, мне просто нужно еще одно, если вы можете мне помочь. Я хотел бы извлечь идентификатор из URL-адреса. Предположим, что URL-адрес http: //...../jackets/cool-red-jacket-25, как я могу извлечь этот 25 в htaccess (это идентификатор продукта, и мне нужно его, чтобы я мог показать этот точный продукт)? Я попытался использовать этот «... /. * - A ([0-9 -.] +) $ Script2.php? Id = $ 1 [L, QSA]", но он извлекает всю строку (cool-red-jacket- 25). Могу ли я сделать это в htaccess или мне нужно получить всю строку и извлечь идентификатор в моем скрипте? –

1

для сео дружественного использования URL-адреса это как:

RewriteRule ^user/([a-zA-Z0-9_-]+)$ user.php?username=$1 
RewriteRule ^item/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ items.php?category=$1&subcategory=$2&id=$3 
1

Вы необходимо добавить более строгое правило в файл .htaccess, чтобы его можно было сопоставить в первую очередь. Используйте это в целом.

Будьте уверены, что самое общее правило (. *), Которое соответствует остальным запросам, может использоваться для более разных действий.

.com/john-doe // for user profile 
.com/my-new-article // for showing article and so on 

Если вы хотите, чтобы объединить все эти варианты и нужно решить, какие действия использовать (профиль или показывать статью) на вашем уровне приложений. Например, контроллер в архитектуре mvc.Это может быть легко достигнуто условиями.

if(userExists($userName)) 
// showing template for user profile etc... 
Смежные вопросы