Назад | Перейти на главную страницу

Почему эта директива mod_rewrite RewriteRule не работает в файле .htaccess?

У меня есть сайт, размещенный на хостинге linux el cheapo, который я переношу на свой сервер Mac OS X 10.5 Leopard Server с Apache 2.2.8 и PHP 5.2.5 с включенным rewrite_module и AllowOverride All, но у меня возникла проблема со следующими строками в .htaccess файл:

RewriteEngine On
#RewriteRule ^view/([^/\.]+)/?$ /view.php?item=$1 [L]
#RewriteRule ^order/([^/\.]+)/?$ /order.php?item=$1 [L]
RewriteRule ^category/([^/\.]+)/?$ /category.php?category=$1 [L]

Как видите, я закомментировал RewriteRule директивы для /view/ и /order/, поэтому я имею дело только с /category/. Когда я пытаюсь загрузить http://domain.tld/category/2/ это работает category.php (Я добавил код отладки для подтверждения), но $_SERVER['REQUEST_URI'] проходит как /category/2/ и $_GET['category'] проходит как пустой.

Обычно я хорошо справляюсь с устранением неполадок с файлами .htaccess и директивами mod_rewrite, но по какой-то причине меня поставили в тупик.

Обновить: Я последовал за Предложение Джоша и вот что сброшено в mod_rewrite.log когда я пытаюсь получить доступ http://domain.tld/category/2/:

65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (2) init rewrite engine with requested uri /category/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) applying pattern '.*' to uri '/category/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (1) pass through /category/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] add path info postfix: /Library/WebServer/Documents/tld.domain.www/category.php -> /Library/WebServer/Documents/tld.domain.www/category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] strip per-dir prefix: /Library/WebServer/Documents/tld.domain.www/category.php/13 -> category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] applying pattern '^category/([^/\.]+)/?$' to uri 'category.php/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (1) [perdir /Library/WebServer/Documents/tld.domain.www/] pass through /Library/WebServer/Documents/tld.domain.www/category.php
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] add path info postfix: /Library/WebServer/Documents/tld.domain.www/category.php -> /Library/WebServer/Documents/tld.domain.www/category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] strip per-dir prefix: /Library/WebServer/Documents/tld.domain.www/category.php/13 -> category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] applying pattern '^category/([^/\.]+)/?$' to uri 'category.php/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (1) [perdir /Library/WebServer/Documents/tld.domain.www/] pass through /Library/WebServer/Documents/tld.domain.www/category.php
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (2) init rewrite engine with requested uri /13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (3) applying pattern '.*' to uri '/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (1) pass through /13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] strip per-dir prefix: /Library/WebServer/Documents/tld.domain.www/13 -> 13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] applying pattern '^category/([^/\.]+)/?$' to uri '13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (1) [perdir /Library/WebServer/Documents/tld.domain.www/] pass through /Library/WebServer/Documents/tld.domain.www/13

просто добавьте это в свой файл .htaccess

Options -MultiViews

у меня была одна и та же проблема в течение нескольких часов

я не знаю почему, но он включен по умолчанию в OSX

он вызывает ошибку, потому что при попытке загрузить категория / он находит category.php и перенаправляет все после косой черты в этот файл

У вас есть доступ к httpd.conf? Если да, добавьте в httpd.conf:

RewriteLog "/tmp/mod_rewrite.log" 
RewriteLogLevel 3

И опубликуйте, что говорится в журнале при загрузке /category/2. Удалите это после того, как получите от него нужную информацию - это очень расточительно для ресурсов сервера.

РЕДАКТИРОВАТЬ:

Спасибо за журнал. Что-то переписывает URL-адрес на: /category.php/13. Какие-нибудь другие правила RewriteRules? Вы используете FastCGI? Что если переименовать category.php к чему-то другому, например Category.php или display_category.php?

РЕДАКТИРОВАТЬ2:

Поскольку что-то вроде переписывает /category/(.*) к /category/$1, а мы не знаем, что это такое, почему бы вам не изменить:

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

кому:

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

и посмотреть, работает ли это?

Я, наверное, здесь идиот, но разве это не ожидаемое поведение? Mod_rewrite изменяет встроенный URL для поиска файла, переменные среды, видимые PHP, обычно не меняются.

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

отметка