web-dev-qa-db-ja.com

このmod_rewriteRewriteRuleディレクティブが.htaccessファイルで機能しないのはなぜですか?

Linux el cheapoホスティングサービスでホストされているサイトがあり、Apache 2.2.8&PHP 5.2.5wを実行しているMacOS X 10.5 Leopard Serverサーバーに移行しています。/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]

ご覧のとおり、/view//order/RewriteRuleディレクティブをコメントアウトしたので、/category/のみを扱っています。 http://domain.tld/category/2/を読み込もうとすると、category.phpが実行されます(確認のためにデバッグコードを追加しました)が、$_SERVER['REQUEST_URI']/category/2/として送信され、$_GET['category']は空として送信されます。

私は通常、.htaccessファイルとmod_rewriteディレクティブのトラブルシューティングに問題はありませんが、これは何らかの理由で私を困惑させます。

Update:私は Joshの提案 に従いました。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
3
morgant

これを.htaccessファイルに追加するだけです

Options -MultiViews

私は何時間も同じ問題を抱えています

理由はわかりませんが、OSXではデフォルトでオンになっています

category /をロードしようとすると、category.phpが検出され、スラッシュの後のすべてがそのファイルにリダイレクトされるため、エラーが発生します。

6
nemdub

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_などの別の名前に変更するとどうなりますか?

EDIT2:

何かが/category/(.*)を_/category/$1_に書き換えているようで、それが何であるかわからないので、変更してみませんか。

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

に:

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

それが機能するかどうかを確認しますか?

1
Josh

私はおそらくここでばかですが、それは期待される動作ではありませんか? Mod_rewriteは、ファイルを検索するためにURLをインラインで変更します。PHPで示される環境変数は、通常は変更されません。

カテゴリ変数を引き出すには、REQUEST_URI文字列を解析する必要があると思います。

マーク

0
mfarver