Перезапись URL с помощью mod_rewrite для предоставления RESTful URL - PullRequest
3 голосов
/ 18 марта 2010

Веб-сервер Apache. Я хочу переписать URL, чтобы пользователь не знал фактический каталог. Например: Исходный URL:

www.mydomainname.com / ен / сдельная / piecework.php? Piecework_id = 11

Ожидаемый URL:

piecework.mydomainname.com / о / 11

Я добавил следующие утверждения в .htaccess:

RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]
RewriteRule ^(w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]

Конечно, я заменил имя моего домена своим именем домена. .htaccess помещается в корень сайта, но когда я захожу на piecework.mydomainname.com/en/11, я получаю «Объект не найден». (Конечно, я заменил имя моего домена своим именем домена).

Я добавил следующие утверждения в .htaccess:

RewriteRule ^/(.*)/en/piecework/(.*)piecework_id=([0-9]+)(.*) piecework.mydomainname.com/en/$3

Конечно, я заменил мое доменное имя своим доменным именем. .htaccess помещается в корень сайта, но когда я захожу на piecework.mydomainname.com/en/11, я получаю «Объект не найден». (Конечно, я заменил имя моего домена своим именем домена).

Что не так?

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Попробуйте использовать RewriteLog в вашем vhost или server-conf для проверки процесса перезаписи. Сейчас вы, кажется, просто догадываетесь, что делает mod_rewrite.

Используя RewriteLogLevel , вы можете изменить расширение ведения журнала. Для начала я бы порекомендовал уровень 5.

PS: не забудьте перезагрузить / перезапустить сервер после изменения конфигурации.

0 голосов
/ 18 марта 2010

Вот краткий обзор того, что происходит:

RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]

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

$ 1 будет (должен) соответствовать чему-либо, кроме 'www' 0 или 1 раз.

$ 2 соответствует всему, что не является символом 1 или более раз, что теоретически соответствует пустому пространству, но, вероятно, никогда не совпадет с чем-либо.

Затем после этих двух групп требуется .mydomainname.com.

Ваши первые два условия ищут две отдельные группировки.

Я не уверен, как именно вы пытаетесь настроить свою структуру, но вот как я бы написал ее, основываясь на ваших исходных и ожидаемых URL:

RewriteCond %{HTTP_HOST} !^www\.mydomainname\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(\w+)\.mydomainname\.com$ [NC]
RewriteRule ^(\w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]

По сути, ваше первое условие - убедиться, что это не URL, начинающийся с «www» (проще просто сделать это отдельным правилом). Второе условие заставляет его проверять любое слово, которое может быть перед вашим доменным именем. Тогда ваше правило перезаписи будет перенаправлено соответствующим образом.

Избавьтесь от последней строки .htaccess в вашем вопросе ...

Кто-то, пожалуйста, поправьте меня, если я что-то не так напечатал. Я не помню, нужно ли указывать «\» перед «\ w» и «\ d», но я все равно включил их.

0 голосов
/ 18 марта 2010

Вы делаете это задом наперед. Идея состоит в том, что вы дадите людям дружественный адрес, а правило перезаписи направит запросы на эту дружественную, несуществующую страницу на настоящую страницу, чтобы они ее не видели. Так что сейчас у вас есть только то, что нужно делать, когда они переходят на некрасивый URL, а вы добавляете дружественный URL. поскольку не существует правила, когда люди помещают дружественный URL-адрес напрямую, apache ищет его и говорит: «Объект не найден»

Добавьте строку:

RewriteRule piecework.mydomainname.com/en/(*.) ^/$3/en/piecework/$3?piecework_id=([0-9]+)(.*)

Извините, это совершенно верно, но основная идея заключается в том, что, если они введут нужный вам URL-адрес, Apache будет готов перенаправить на реальную страницу без просмотра ее браузером.

Обновление

Я сонный, чтобы правильно выполнять регулярные выражения, поэтому я просто старался изо всех сил, чтобы переместить ваш пример, извините. Сначала я бы попробовал что-то более простое, чтобы сначала изложить основную концепцию. Попробуйте это:

RewriteRule www.mydomainname.com/en/piecework/piecework\.php\?piecework_id\=11 piecework.mydomainname.com/en/11

По крайней мере, будет легче увидеть, что не работает, если вы получите ошибки.

...