косая черта в конце дает внутреннюю ошибку сервера

Я хочу, чтобы все мои страницы работали, если пользователь добавил косую черту в конце или нет.

следующая строка работает

RewriteRule ^index/page/([0-9]+)/?$ /cmstut/index.php?page=$1 [QSA,L]

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

RewriteRule ^(.+[^/])/?$ /cmstut/$1.php [QSA,L]

person Christophe    schedule 22.11.2009    source источник
comment
Что вы хотите сказать этим регулярным выражением: .+[^/] ?   -  person Dmitry    schedule 22.11.2009
comment
stackoverflow.com/questions/314872/ см. ответ Грега   -  person Christophe    schedule 22.11.2009


Ответы (1)


Вам лучше использовать только одно написание (с косой чертой или без нее) и перенаправить, если запрошенный путь URI неверен:

# add trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301]

# remove trailing slash
RewriteRule (.+)/$ /$1 [L,R=301]
person Gumbo    schedule 22.11.2009
comment
Я вижу, я думаю, что это было бы лучше всего. поэтому я копирую добавленную косую черту или удаляющую косую черту, но не оба, верно? что на ваш взгляд лучше, с или без? - person Christophe; 23.11.2009
comment
@krike: Да, вам понадобится только одно из двух правил. В противном случае вы получите бесконечный цикл рекурсии. И я бы предпочел вариант без косой черты. - person Gumbo; 23.11.2009
comment
Поэтому я заменил RewriteRule ^(.+[^/])/$ /cmstut/$1.php [QSA,L] на RewriteRule (.+)/$ /cmstut/$1 [L,R=301], если я ищу localhost/cmstut/tutorial/65 не должен ли он удалить последний / ?? Теперь я могу просматривать как localhost/cmstut/tutorial/65, так и localhost/cmstut/tutorial/65 и не имеют внутренней ошибки сервера :) так что в некотором смысле это исправлено, если бы вы могли просто уточнить мой вопрос выше - person Christophe; 24.11.2009
comment
о нет.... все еще небольшая проблема, мои подкарты (магазин и администратор) не работают, когда я перехожу к localhost/cmstut/shop/index я получаю 404 не найден. то же самое для карты администратора. - person Christophe; 24.11.2009
comment
@krike: попробуйте функцию ведения журнала (см. RewriteLogLevel), чтобы отследить причину. - person Gumbo; 24.11.2009
comment
127.0.0.1 - - [24/ноября/2009:21:51:34 +0100] [localhost/sid#905150][rid#12e1600/initial] (3) [perdir I:/wamp/www/cmstut/] полоса префикс для каждого каталога: I:/wamp/www/cmstut/ -> 127.0.0.1 - - [24/Nov/2009:21:51:34 +0100] [localhost/sid#905150][rid#12e1600/initial] (3) [perdir I:/wamp/www/cmstut/] применение шаблона '^shop/item/(.*)/?$' к uri '', это одна из строк с магазином localhost/cmstut/index например, для uri 'index.php', а все остальные страницы имеют страницу в uri - person Christophe; 24.11.2009
comment
Хорошо, я вижу, что мой ответ трудно прочитать, но на самом деле между кавычками в uri для магазина нет страницы, в то время как на других страницах есть что-то между кавычками в uri - person Christophe; 25.11.2009
comment
@krike: при использовании mod_rewrite в файле .htaccess префикс для каждого каталога удаляется перед проверкой правил. В вашем случае вы, кажется, запрашиваете /cmstut/, где /cmstut/ также является удаленным префиксом. - person Gumbo; 25.11.2009
comment
эээ.... это мой код htaccess, думаю, вам будет легче его увидеть. Что я делаю не так ? cmstutorials.org/htaccess_online.txt - person Christophe; 26.11.2009
comment
@krike: Всегда ставьте те правила, которые вызывают внешнее перенаправление, перед теми, которые вызывают внутреннее перенаправление/перезапись. Другая проблема заключается в том, что директивы RewriteCond определяют условия только для следующего RewriteRule. - person Gumbo; 26.11.2009
comment
Я разместил внешние перенаправления между комментариями, и они активируются до того, как внутренние перепишутся. о rewriteCond... хорошо, но что мне теперь делать? Я понятия не имею, что мне делать. - person Christophe; 26.11.2009
comment
@krike: вы можете использовать правило прерывания, которое завершает процесс перезаписи, если запрашивается существующий файл или каталог: RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] - person Gumbo; 26.11.2009
comment
Я изменил его обратно на RewriteRule ^(.+[^/])/?$ /cmstut/$1.php [QSA,L], и он снова работает. так что я предполагаю, что что-то не так. Я получаю только внутреннюю ошибку сервера для страниц, которых не существует... странно... так что на данный момент это работает, но я дам вам знать, если будут какие-то ошибки. - person Christophe; 27.11.2009