Apache mod_rewrite: URL 内のスラッシュをどのように処理しますか?

Apache mod_rewrite: URL 内のスラッシュをどのように処理しますか?

URL 構造は次のようになります。

http://mysite.com/movies/index.php?id=123

index.php?id=123 を削除し、代わりに次の URL を使用します。

http://mysite.com/movies/123

/var/www/mysitecom/movies ディレクトリに次の .htaccess を作成しました。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ mysitecom/movies/index.php?id=$1 [L,QSA]

そしてそれは動作します。たとえば、次のように指定すると...

http://mysite.com/movies/123

...わかりました...

http://mysite.com/movies/index.php?id=123

...を指定するとトラブルが始まります。

http://mysite.com/movies/123/

このスラッシュでは、URL が適切に処理されません。 id をまったく指定していないようで、すべての CSS スタイルが適用されません。

次のようなルールで正規表現を試してみました...

RewriteRule ^([^/]+)[/]*$ mysitecom/movies/index.php?id=$1 [L,QSA]

...しかし、それは役に立ちませんでした。

私の質問は、私の場合スラッシュをどのように処理するかということです。書き換えルールを選択する必要がありますか、それとも何か他のことをする必要がありますか?http://mysite.com/movies/123/全く同じように処理されますhttp://mysite.com/movies/123。 何かご意見は?

ありがとう、

アップデート:

ユーザーDSumsky私を助けてくれました(下記)。

ドゥムスキーご回答ありがとうございます。テキストの書式設定機能を得るために、回答の形式でコメントすることにしました。

まず、ログ記録を有効にできませんでした。.htaccess に次の文字列が含まれていると...

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

...次のエラーが発生します:

Rewrite log not allowed here

さて、これらの文字列を /etc/apache2/apache2.conf に配置して、Apache を再起動しました。rewrite.log は作成されましたが、書き換えが行われても空になります。

2 番目に、次の文字列がないとまったく機能しませんでした。

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

そこで、それらを追加しました。すると、%{HTTP_HOST} で問題が発生したため、パスを指定して少し変更しました。

RewriteRule ^([^/]*)/?$ mysitecom/movies/index.php?id=$1 [L]

状況は良くなりました。http://mysite.com/movies/123そしてhttp://mysite.com/movies/123/id が適用されているのがわかります。前者の場合はすべてが完全に正常ですが、後者の場合は CSS スタイルがまったく指定されていないかのように適用されません。なぜそうなるのか理解できません。私の場合、スタイルは Rewrite Rule が実行される前に適用されているように見えます。次のようにスタイルをリンクしているのでそうだと思います。

つまり、/123 では動作するようです。つまり、Apache は ../library/main.css を見つけることができますが、/123/ の場合は埋め込みディレクトリのようで、../library/main.css は動作しません。

何か案は?

アップデート2:

分かりました。最後の .htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RedirectMatch ^(.+[\d+])/$ $1
RewriteRule ^([^/]*)$ mysitecom/movies/index.php?id=$1 [L]

DSumskyご協力ありがとうございます。あなたの投稿を回答としてマークします。

答え1

要件を満たすテスト用 VirtualHost を作成し、次の書き換えルールを設定しました。これは、意図したとおりに機能するようです。

RewriteEngine On
RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

RewriteCond %{HTTP_HOST} mysite\.com [NC]
RewriteRule ^/movies/([^/]*)/?$ %{HTTP_HOST}/movies/index.php?id=$1 [L]

このルールは、一種の映画 ID である URI の最後の部分に一致し、末尾のスラッシュがある場合はそれを削除します。

書き換えエンジンに関して何が起こっているのかわからない場合は、私が設定したようにログを有効にしてください。エンジンが実行したすべてのステップを検査し、ルールを適切にテストできます。

次の URL でテストしました。

http://mysite.com/movies/123
http://mysite.com/movies/123/

ログ内で対応する行を見つけました:

init rewrite engine with requested uri /movies/123
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123'
rewrite '/movies/123' -> 'mysite.com/movies/index.php?id=123'

init rewrite engine with requested uri /movies/123/
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123/'
rewrite '/movies/123/' -> 'mysite.com/movies/index.php?id=123'

関連情報