1

サイトのルートに、次のような一般的な書き換えルールがあります。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1

これは、「www.example.com/myAction」のような URL を「www.example.com/index.php?action=myAction」に書き換えるのに問題なく機能します。

これはこのままにしておく必要がありますが、サブディレクトリ (「/login」) を書き換えから除外する必要があります。

だから私は試しました:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/login/
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1

しかし、まだ運がありません。ここSOでいくつかの回答を読みましたが、欠陥が見つかりません。何か案は?ありがとうございました!

4

2 に答える 2

5

余分なスラッシュがあります。.htaccessとは異なり、前のスラッシュを使用しませんVirtual Host。ディレクトリでも/login/あります。したがって、実際のファイルではなく、実際のディレクトリである可能性があるものと一致しています。したがって、たとえば「/css/」が存在する場合、要求に応じてアクションとして index.php に書き換えます。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+) index.php?action=$1

それでも予期しない動作をする場合は、既存のディレクトリを書き換えていないことを確認して、これを試してください:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+) index.php?action=$1

?また、ルックアップを使用しているため、投稿されたサンプルコードで最初のスラッシュ (おそらく) までしかキャプチャしていないことに気付きました。そのため、以前のレイアウトでは、そのコードを少し短く表示しています。URI全体をキャプチャするには、次のようにします。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^(.*) index.php?action=$1

2 番目 (および 3 番目) の文字列をキャプチャするには、次のようにします。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?action=$1&page=$2&response=$3
于 2013-05-04T10:38:39.040 に答える