1

.htaccess ファイルの操作中に奇妙な問題に直面しています。

これが私のファイルです:

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On

RewriteRule ^(admin)($|/) - [L]

RewriteRule ^$ ./web/view/
RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)$ ./web/view/?module=$1&id1=$2&id2=$3
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)/$ ./web/view/?module=$1&id1=$2&id2=$3
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)$ ./web/view/?module=$1&id1=$2
RewriteRule ^([A-Za-z0-9]+)/([0-9]+)/$ ./web/view/?module=$1&id1=$2

ErrorDocument 404 err.php

</IfModule>

最後のルールに を追加する[a-z][0-9]、500 エラーが発生します。たとえば、次の行では 500 エラーが返されます。

RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2

しかし、私が使用するA-Zと、正常に動作します。

RewriteRule ^([A-Za-z0-9]+)/([A-Z0-9]+)/$ ./web/view/?module=$1&id1=$2

でも[NC]同じエラーが発生しています。

この問題を特定して修正するのを手伝ってもらえますか?

4

2 に答える 2

0

私の最初の本能は、各書き換え行の最後に [L] を追加することです。次に例を示します。

RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1 [L]

書き換えは互いに独立しているため、これは問題なく機能します。

2 番目のステップは、スラッシュ (/) がオプションである RewriteRule ディレクティブの各グループを統合することです。

RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/$ ./web/view/?module=$1

次のように言っても安全です。

RewriteRule ^([A-Za-z0-9]+)/?$ ./web/view/?module=$1

疑問符 (?) は、0 または 1 を意味しますが、直前の文字、グループ、または式を超えないことを意味します。

最後に、RewriteRule ディレクティブのグループを最適化することを検討してください。

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On

RewriteRule ^(admin)($|/) - [L]

RewriteRule ^$ ./web/view/ [L]
RewriteRule ^([A-Za-z0-9]+)/?((([A-Za-z0-9]+)/?)?(([A-Za-z0-9]+)/?)?)?$ ./web/view/?module=$1&id1=$4&id2=$6 [L]

ErrorDocument 404 err.php

</IfModule>

おまけ情報として、 QSA (クエリ文字列の追加) フラグを使用する価値があるかもしれません。たとえば、次のようになります。

RewriteRule ^$ ./web/view/ [L,QSA]

gskinner の RegExr ツールを使用して、正規表現の作成、テスト、またはトラブルシューティングを行うことも検討してください。

最後に、.htaccess ファイルで、AllowOverrides ディレクティブの定義方法によっては、mod_rewrite ロギングをオンにできる場合があります。

RewriteLog "/path/to/your/home/dir/rewrite.log"
RewriteLogLevel 4

ただし、Apache サーバーのバージョンまたは構成によっては、RewriteLog/Level が非推奨になっているため、モジュールごとのログ構成を使用する必要がある場合があります。

LogLevel alert rewrite:trace4

免責事項として、このレベルのログ記録は Web サーバーの速度を低下させるため、長時間有効にしたり、運用環境で有効にしたりしないでください。

于 2012-08-02T23:54:32.633 に答える
0

最後のルールに を追加する[a-z][0-9]、500 エラーが発生します。たとえば、次の行では 500 エラーが返されます。

その理由は、書き換えエンジンが無限ループに入るためです。

  1. リクエスト URI は次のようになります/something/id/(末尾のスラッシュに注意してください)
  2. 次のルールに一致します。RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
  3. URI は次のように書き換えられます/web/view/?module=something&id=id
  4. 新しい URI は書き換えエンジンに戻されます。新しい URI =/web/view/
  5. URI は (同じ) ルールに一致します。RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
  6. URI は次のように書き換えられます/web/view/?module=web&id=view
  7. 手順 4 から繰り返します

ループしないように条件を追加する必要があります。

RewriteCond %{REQUEST_URI} !/web/view
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/$ ./web/view/?module=$1&id1=$2
于 2012-08-02T23:04:32.073 に答える