web-dev-qa-db-ja.com

.htaccessを使用して、ルールを書き換えてディレクトリとして表示する

.htaccessファイルに書き換えルールを実装して、特定のURLをサーバーのディレクトリとして表示したい。私が書いた以下のコードを参照してください、

RewriteRule ^(.*)/$ ?page=$1 [NC]

これにより、www.mysite.com/abc/などのURLがwww.mysite.com/index.php?page=abcに書き換えられます。
しかし、www.mysite.com/abcをリクエストすると、404エラーがスローされます。
www.mysite.com/abcwww.mysite.com/abc/の両方に一致する書き換えルールを作成するにはどうすればよいですか?

編集:
現在の.htaccessファイル( Litso's answerrd revision の後)は次のようになります。

##

ErrorDocument 401 /index.php?error=401
ErrorDocument 400 /index.php?error=400
ErrorDocument 403 /index.php?error=403
ErrorDocument 500 /index.php?error=500
ErrorDocument 404 /index.php?error=404

DirectoryIndex index.htm index.html index.php

RewriteEngine on
RewriteBase /
Options +FollowSymlinks
RewriteRule ^(.+)\.html?$ $1.php
RewriteCond !-d
RewriteRule ^(.*)/$ ?page=$1 [NC,L]
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ ?page=$1 [NC,L]

##
5
chanchal1987

更新

RewriteCond !-d
RewriteRule ^(.*)/$ ?page=$1 [NC,L]

RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ ?page=$1 [NC,L]

これは最初にURLをスラッシュで書き換えますが、既存のディレクトリではない場合のみです。

見つからない場合は、スラッシュなしでURLを書き換えます(ただし、index.phpでない場合にのみ、既に書き換えられたURLは無視されます)。

3
Stephan Muller

次の条件とルールがあなたのためのトリックを行う必要があります。 RewriteCond ディレクティブを論理AND(デフォルト)または論理OR([OR]を追加すること)でチェーンできます。

# Check that there's no directory with that name
RewriteCond !-d
# Check that there's no regular file with that name
RewriteCond !-f
# Prevent loop if index.php is requested
RewriteCond %{REQUEST_URI} !index.php
# Finally rewrite the request; trailing slash optional
RewriteRule ^(.*)/?$ index.php?page=$1 [NC,L]
1
joschi