2010-02-03 2 views
5

мне нужно, чтобы включить дополнительный замыкающий forwardslash, это /, в моей RewriteRule.htaccess регулярного выражения нужно сделать слэша опционального

То, что я до сих пор

RewriteRule ^([a-zA-Z0-9]+)$ u.php?$1|$2 

Который работает отлично , например, http://foo.bar/abcde перенаправляет на http://foo.bar/u.php?abcde и обрабатывает любые параметры запроса, которые могут присутствовать.

Что мне нужно сделать, это взять http://foo.bar/abcde/ (с завершающим forwardslash) и перенаправлять http://foo.bar/u.php?abcde

Так что, если его нет, мне нужно удалить окончательный косую черту от $ 1 в моей RewriteRule. Как мне это сделать? Я новичок в apache и пробовал много разных правил регулярных выражений, но не могу понять.

ответ

14

Просто поместите /? перед $ в конце вашей схеме:

RewriteRule ^([a-zA-Z0-9]+)/?$ u.php?$1 

Но я предпочел бы предложить вам разрешить только одно написание (с или без пробелов) и перенаправить другую:

# remove trailing slash 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*)/$ /$1 [L,R=301] 
# add trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ /$0/ [L,R=301] 
+0

@Phil: Нет, это невозможно. Единственное, что вы можете сделать, это либо удалить его, либо добавить его ко всем запросам. – Gumbo

+0

На самом деле для того, что я пытаюсь достичь, имеет смысл использовать оба написания, поэтому я собираюсь использовать два правила перезаписи на данный момент, пока я полностью не пойму, что вы предложили с помощью «RewriteCond». – Phil

+1

@Phil: два условия позволяют избежать перенаправления запросов, которые могут быть сопоставлены с существующими каталогами ('-d') или с существующими файлами (' -f'). – Gumbo

Смежные вопросы