1

私は次のmodの書き直しを持っています:

RewriteEngine On

# rest api rewrites
RewriteCond %{REQUEST_URI} /api/v [NC]
RewriteRule ^(.*)$ /index.php/$1 [L,QSA]

# main application rewrite
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^/[a-zA-Z0-9\-\_/]+?$ /index.html [L,QSA]

これらをvhost構成に入れると、すべてが例外として機能しますが、これを.htaccessファイルに入れると、最初の書き換えは無限ループを実行し(ログには内部書き換えが表示されます)、2番目の書き換えはまったく機能しません。

なぜこれらの書き換えはvhostにあるのに、私の.htaccessファイルにはないのですか?

4

1 に答える 1

1
  1. ターゲットが正規表現と一致するため、最初のルールがループします。したがって、最初に書き換えてルールがループすると、^(.*)$ matches the URI that you've just rewritten to (/ index.php / etc ... `)、無限ループが発生します(または、内部リダイレクト制限はに設定されています)。ループを防ぐために条件を追加する必要があります。

    # rest api rewrites
    RewriteCond %{REQUEST_URI} !^/index\.php
    RewriteCond %{REQUEST_URI} /api/v [NC]
    RewriteRule ^(.*)$ /index.php/$1 [L,QSA]
    
  2. htaccessファイルのルールを通過するURIでは先頭のスラッシュが削除されているため(htaccessは基本的<Directory>にvhost / server構成のようなものであるため)、2番目のルールはまったく適用されません。したがって、少なくとも先頭のルールを作成する必要があります。オプションのスラッシュ:

    # main application rewrite
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    RewriteRule ^/?[a-zA-Z0-9\-\_/]+?$ /index.html [L,QSA]
    
于 2012-10-26T04:24:47.073 に答える