мод переписать - второе правило не работает - PullRequest
0 голосов
/ 04 декабря 2011

Я пытаюсь научиться переписывать URL.

Мой код:

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

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

РЕДАКТИРОВАТЬ Я хочу сделать следующее: если указан только исходный домен, он должен перейти на главную страницустр.Например: www.mysite.com -> www.mysite.com/index.php.В противном случае, если www.mysite.com/contactus -> www.mysite.com/index.php?page=contactus

РЕДАКТИРОВАТЬ Я использую сервер WAMP в Windows XP.

Ответы [ 5 ]

1 голос
/ 04 декабря 2011

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

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

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

Редактировать 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.


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

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

RewriteEngine on
# page-url -> index.php?page=page-url
RewriteRule ^([^/]+)/?$ index.php?page=$1 [L]
0 голосов
/ 04 декабря 2011

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

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

или

RewriteRule ^/([a-z/]*/)?([a-z]+)$ /index.php?page=$2
0 голосов
/ 04 декабря 2011

@ trott и @anders_lindahl правы:

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

Второе правило будет соответствовать любому, что имеет строчные буквы (и просточто!) после первого слэша, так что localhost/thisisavalidstring.

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

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

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

0 голосов
/ 04 декабря 2011
RewriteRule ^/([a-z]+)$ /index.php?page=$1

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

0 голосов
/ 04 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...