web-dev-qa-db-ja.com

500内部サーバーエラーを作成するRewriteRule

.htaccessファイルに次のものがあります。

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^directory/(.*)$ directory/index.php?id=$1

私が達成しようとしているのはこれです:

URL www.mydomain.com/directory/10が訪問され、ページwww.mydomain.com/directory/?id=10は、URLの外観を変更せずにブラウザに表示されます。

ただし、上記のコードは500内部サーバーエラーを作成します。

誰かが私がどこで間違っているのか知っていますか?

10
Tom

コードは無限のループを引き起こしているため、500の内部サーバーエラーを生成することが保証されています。理由は、一致するURIパターンが次のとおりであるためです:^directory/(.*)$

これは、書き換えの前後のURLと一致します。そして、最大許容内部書き換え制限に達すると、Apacheは500の内部サーバーエラーをスローし、ベイルアウトします。

コードを次のように変更します。

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^directory/(.*)$ /directory/index.php?id=$1 [L,QSA,NC]

上記のコードには追加のRewriteCond %{REQUEST_FILENAME} !-fがあり、/directory/index.phpが有効なファイルになるため、初回以降のRewriteRuleの実行を確実に禁止します。

17
anubhava

同じ問題が発生しましたが、私の場合、「書き換え」モジュールがまだ有効になっていないことがわかりました。だから私はそれを有効にしてからApacheサーバーを再起動する必要があります:

  • 「rewrite」モジュールを有効にします:Sudo a2enmod rewrite
  • 次に、Apacheサーバーを再起動します。SudoサービスApache2の再起動

これが誰にでも役立つことを願っています。

14
Brilliant-DucN

前面にスラッシュを追加してみてください。

RewriteRule ^/directory/(.*)$ directory/index.php?id=$1

私は前にそれに巻き込まれたことがあります。

または、RewriteLogとRewriteLogLevelを使用してデバッグし、Apacheエラーとアクセスログで詳細を確認します。

RewriteLogLevel 3
RewriteLog ${Apache_LOG_DIR}/rewrite.log

これにより、Apacheログディレクトリにログファイルが残ります。私の場合、それは/var/log/Apache

2
Paul S

CodeIgniterを使用していて、エラーの問題が発生している場合500。解決策に従ってください。

したがって、CodeIgniterでURL​​のセグメント「index.php」を削除するには、2つのことを行う必要があります。 1つ目は、/system/application/config/config.phpファイルを編集して、index_pageポリシーの値を空に変更することです。

$config['index_page'] = '';

2番目のステップは、ファイル.htaccessを作成することです。

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

以上です!今後、CodeIgniterで作成されたサイト/システムのURLには、「index.php」というスレッド(「迷惑」と呼ばれることもあります)がなくなります。

0
Davi Sousa