мод переписать и статические страницы - PullRequest
1 голос
/ 15 июля 2010

возможно ли исключить анализ URL при перезаписи мода?В моем .htaccess есть правила переписывания, такие как

RewriteRule ^contact contact_us.php

и еще пара статических страниц.

в настоящее время мой сайт не имеет проблем, потому что использует http://domain.com/user.php?user=username, но теперь мне нужно переписать:

http://domain.com/username

Я пробовал с:

RewriteRule ^(.*)$ user.php?user=$1 [L]

но весь мой сайт перестает работать ...

можно избежать синтаксического анализа моих статических страниц, таких как contact / feed / etc, которые обрабатываются как имена пользователей?

изменить, чтобы соответствовать давиду req:

это мой фактический файл .htaccess:

RewriteEngine On
Options +Followsymlinks

RewriteRule ^contact contact_us.php [L]
RewriteRule ^terms terms_of_use.php [L]
RewriteRule ^register register.php [L]
RewriteRule ^login login.php [L]
RewriteRule ^logout logout.php [L]
RewriteRule ^posts/(.*)/(.*) viewupdates.php?username=$1&page=$2 
RewriteRule ^post(.*)/([0-9]*)$ viewupdate.php?title=$1&id=$2 
RewriteRule ^(.*)$ profile.php?username=$1 [L] 

также я включил журнал Modrewrite мой первый файл: http://pastie.org/1044881

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Сначала поместите правила перезаписи для статических страниц и добавьте к ним флаг [L]:

RewriteRule ^contact contact_us.php [L]
...

затем после тех, используйте ваше правило перезаписи для имени пользователя:

RewriteRule ^(.*)$ user.php?user=$1 [L]

(надеюсь, никто не имеет имя пользователя contact).

РЕДАКТИРОВАТЬ : Основываясь на выводе журнала, который вы разместили (который, я предполагаю, соответствует неудачной попытке доступа к странице contact ... верно?), Попробуйте изменив правило перезаписи contact на

RewriteRule ^contact$ contact_us.php [L]

или

RewriteRule ^contact contact_us.php [L,NS]

То есть либо добавьте $, чтобы шаблон соответствовал только буквальному URL-адресу contact, либо добавьте флаг NS, чтобы он не применялся к подзапросам. Согласно выводу журнала, похоже, что произошло то, что Apache переписывает contact в contact_us.php, а затем выполняет внутренний подзапрос для этого нового URL. Все идет нормально. Странно то, что шаблон ^contact снова соответствует contact_us.php, «преобразовывая» его в contact_us.php, то есть то же самое, что Apache интерпретирует как сигнал о том, что он должен полностью игнорировать правило. Теперь, я думаю, 1034 * Apache будет иметь смысл игнорировать правило только для подзапроса, но я не уверен, что он игнорирует весь процесс перезаписи весь и оставляет исходный URL, /contact, как есть. Если это так, внесите одно из предложенных изменений и исправьте его.

РЕДАКТИРОВАТЬ 2 : ваша выдержка из журнала перезаписи напомнила мне кое-что: я бы предложил сделать правило перезаписи

RewriteRule ^([^/]+)$ user.php?user=$1 [L]

поскольку косые черты не должны встречаться ни в одном из имен пользователей. (Верно?) Или вы могли бы сделать

RewriteRule ^(\w+)$ user.php?user=$1 [L]

если имена пользователей могут включать только символы слов (буквы, цифры и подчеркивание). По сути, создайте регулярное выражение, которое соответствует только любой последовательности символов, которая может быть допустимым именем пользователя, но не соответствует URL-адресам изображений или файлов CSS / JS.

1 голос
/ 15 июля 2010

Опции -f и -d для RewriteCond проверяют, является ли текущее совпадение файлом или каталогом на диске.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ....
...