Почему это правило перезаписи не работает?

Я использую следующий код в своем .htaccess:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

# Special rewrite rules
# ideas/<id>
RewriteRule ^ideas/([0-9]+)$ idea\?id=$1
# users/<name>
RewriteRule ^users/(.+)$ users\?name=$1

Идеи/правило работает нормально, как я и ожидал, но пользователи/правило, похоже, не работает. Это дает мне ошибку HTTP 500, а в журнале Apache говорится, что превышено количество доступных перенаправлений:

[Вс, 14 июня 10:58:39 2009] [ошибка] [клиент 127.0.0.1] Запрос превысил ограничение в 10 внутренних перенаправлений из-за вероятной ошибки конфигурации. Используйте «LimitInternalRecursion», чтобы увеличить лимит, если это необходимо. Используйте «отладку LogLevel», чтобы получить обратную трассировку. Referer: http://localhost/users

URL-адрес, который я тестирую, — это /users/ross, который должен работать нормально. /ideas/1 определенно работает нормально.


person Ross    schedule 14.06.2009    source источник


Ответы (4)


Попробуйте в таком порядке:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

RewriteRule ^ideas/([0-9]+)$ idea?id=$1
RewriteRule ^users/(.+)$ users?name=$1

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]
person Gumbo    schedule 14.06.2009
comment
Это приводит к тому, что страницы с идеями/‹id› перестают работать с той же ошибкой. - person Ross; 14.06.2009
comment
И что об этом говорит лог сервера? Ошибка 500 может означать что угодно. - person Gumbo; 14.06.2009
comment
MultiViews отключен? Если нет, попробуйте отключить его. См. http://httpd.apache.org/docs/2.2/content-negotiation.html#multiviews - person Gumbo; 14.06.2009

Что может помочь вам отладить ситуацию, так это сделать перезапись удаленной (например, заставить их отправлять перенаправления HTTP). Таким образом, вы увидите, как переписываются запросы, что должно помочь вам обнаружить проблему.

person che    schedule 14.06.2009

Правильно ли я предполагаю, что у вас есть файлы users.php и idea.php? Затем вы можете перенаправить на этот файл напрямую, без необходимости еще одного раунда перезаписи. Итак, для этих двух правил:

RewriteRule ^ideas/([0-9]+)$ idea.php?id=$1
RewriteRule ^users/(.+)$ users.php?name=$1

(также: не нужно избегать знака вопроса в результате)

Кстати: почему users.php во множественном числе, а idea.php — нет? Как вы справляетесь с /ideas/abc и так далее?

person Arjan    schedule 14.06.2009
comment
Множественное число было ошибкой, с тех пор я исправил это. Однако изменение перенаправлений, указывающих на файлы напрямую, работает (хотя мне было бы интересно узнать, почему это не подчиняется более ранним правилам). - person Ross; 14.06.2009
comment
В вашей файловой системе нет подпапок пользователей или идей, которые могли бы вызвать разницу между двумя результатами? Я чувствую, что более ранние правила были просто неполными (как и ваш собственный ответ, на мой взгляд) ... При указании сценария вы даже можете добавить [L], чтобы указать, что вы сделали. - person Arjan; 14.06.2009

Добавление / перед файлами исправило это:

RewriteRule ^ideas/([0-9]+)$ ideas?id=$1
RewriteRule ^users/(.+)$ users?name=$1

to:

RewriteRule ^ideas/([0-9]+)$ /ideas?id=$1
RewriteRule ^users/(.+)$ /users?name=$1
person Ross    schedule 14.06.2009
comment
Вы не используете какой-то путь в URL-адресе, например, example.org/folder/users/abc, верно? И почему бы не переписать скрипт, который вам нужен, вместо того, чтобы заставить Apache выяснять, что делать с /users?name=$1? - person Arjan; 14.06.2009