2011-12-04 25 views
0

Я пытаюсь изучить переписывание URL.mod rewrite - второе правило не работает

Мой код:

RewriteEngine on  
RewriteRule ^/$ /index.php 
RewriteRule ^/([a-z]+)$ /index.php?page=$1 

Когда я пытаюсь это так: localhost/mysite он показывает домашнюю страницу. Но когда я пробую что-то вроде этого: localhost/mysite/abcdefg, он будет показывать ошибку 404.

EDIT То, что я хочу сделать, это: Если только оригинальный домен задан, он должен перейти домашнюю страницу. Например: www.mysite.com ->www.mysite.com/index.php. В противном случае, если www.mysite.com/contactus ->www.mysite.com/index.php?page=contactus

EDIT Я использую сервер WAMP в Windows XP.

+1

Я вижу ваши изменения, но вы не можете проверить, что переписывают в текущей структуре URL вы имеете в локальный. Вы должны попробовать и настроить виртуальные хосты для тестирования в среде, которая как можно больше напоминает ваше производство. – Shef

+0

Можем ли мы добавить дополнительное условие, которое можно легко удалить позже. Значит, если это localhost, используйте 'localhost/mysite /' иначе просто 'www.mysite.com /'? –

+0

Да, вы можете. Я собираюсь обновить свой ответ с помощью этого решения. Однако для вас было бы лучше, если бы вы использовали виртуальные хосты. – Shef

ответ

1

Это потому, что первое правило будет ловить второй запрос. Теперь я внимательно посмотрел на регулярное выражение, но он не поймал бы запрос. Однако ваш второй запрос не удался. Кроме того, как правило, чем более специализированным является переписывание, тем выше он должен быть помещен.

Вам не нужно переписывать все запросы для индексации, но если вы знаете, что делаете, то переупорядочивайте переписывание.

RewriteEngine on  
RewriteRule ^/([^/]+)/$ index.php?page=$1 [L] 
RewriteRule ^/$ index.php [L] 

Edit 1: Принимая во внимание, что вы работаете на локальном хосте, это будет работать для вас.

RewriteEngine on 
RewriteBase /mysite/ 
RewriteRule ^([^/]+)/?$ mysite/index.php?page=$1 [L] 
RewriteRule ^$ mysite/index.php [L] 

Когда вы идете жить, просто удалить mysite/ часть.

Примечание: Вам не нужно это правило RewriteRule ^$ /index.php [L] сервер будет автоматически загружать index.php, если вы посещаете localhost/mysite. Это ожидаемое поведение, если на вашем сервере настроена загрузка страницы по умолчанию, файл index.php, в файле конфигурации httpd.conf.


Edit 2: Я вижу ваши изменения, но вы не можете проверить, что переписывают в текущей структуре URL вы имеете в локальном хосте. Вы должны попробовать и настроить виртуальные хосты для тестирования в среде, которая как можно больше напоминает ваше производство. Найдите в Google, как создавать виртуальные хосты для вашего WAMP, XAMPP или любого другого стека, который вы используете.

Тогда правила перезаписи просты

RewriteEngine on 
# page-url -> index.php?page=page-url 
RewriteRule ^([^/]+)/?$ index.php?page=$1 [L] 
+0

Первое правило не будет улавливать второй запрос. Это в основном start-slash-end, который не является чем-то, что ловит '/ mysite/abcdefg'. Проблема заключается в том, что '/' не соответствует. – Nanne

+0

@Nanne Я редактировал. Благодарю. – Shef

+0

А, я вижу. Но я не думаю, что текущее регулярное выражение имеет слишком большой смысл? Я до кофе, но похоже, что он принимает только 1 символ, который не является '/'? – Nanne

0

/localhost/mysite/abcdefg не соответствует правилу, которое вы ожидаете от него, потому что путь (/mysite/abcdefg) содержит / в середине, который не соответствует вашему регулярному выражению. Таким образом, веб-сервер ищет файл, не может найти его, и возвращает 404.

0
RewriteRule ^/([a-z]+)$ /index.php?page=$1 

будет соответствовать любой строке, начиная с / с последующим любым количеством символов a-z. / не находится в этом диапазоне, поэтому он не работает на /mysite/abcdefg.

0

@trott и @anders_lindahl прав:

Ваш первый соответствует только localhost/ ака корень сайта.

Второе правило будет соответствовать любому, что имеет строчные буквы (и только это!) После первой косой черты, поэтому .

Вы разместили там /, чтобы он не совпал. использовать что-то вроде:

RewriteRule ^/([a-z\/]+)$ /index.php?page=$1 

(не пробовал, но я предполагаю, что это будет работать, я не слишком уверен, что о необходимости экранировать внутри [].)

0

Вы, вероятно, означало использовать

RewriteRule ^/([a-z/]+)$ /index.php?page=$1 

или

RewriteRule ^/([a-z/]*/)?([a-z]+)$ /index.php?page=$2 
Смежные вопросы