0

KohanaFramework3.xを使用しています。私のWebサーバーはApacheであり、サーバーで複数のWebサイトを管理しているため、仮想ホストを使用しています。

私のhttpd.confは次のようになります。

  <VirtualHost *:80>
 ServerName www.myPage1.com
 ServerAlias myPage1.com
 DocumentRoot /var/www/myPage1
</VirtualHost>
<VirtualHost *:80>
 ServerName www.myPage2.com
 ServerAlias myPage2.de
 DocumentRoot /var/www/myPage2
</VirtualHost>

コハナでは、すべてのhttpリクエストは最初にindex.phpに移動する必要があります。すべてがindex.phpで始まるこれらの醜いURL(たとえば、www.myPage1.com / index.php / item / detail / itemId)が気に入らないため、完全に機能する次の.htaccessファイルを使用しました。

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

.htaccessファイルを使用せず、代わりにすべての書き換えロジックをhttpd.confファイルに入れたいと思います。以下は私に「400BadRequest」を与えます

<VirtualHost *:80>
 RewriteEngine On
 <Files .*>
  Order Deny,Allow
  Deny From All
 </Files>
 RewriteRule ^(?:aplication|modules|system)\b.* index.php/$0 [L]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule .* index.php/$0 [PT]

 ServerName www.myPage2.com
 ServerAlias myPage2.com
 DocumentRoot /var/www/myPage2
</VirtualHost>

私は何が間違っているのですか?助けていただければ幸いです!

4

4 に答える 4

3

条件付きのVirtualHostブロックでmod_rewriteを使用している場合、ファイル名は取得されません(これはドキュメントによるものです)。代わりに、この変数には、クエリ文字列を除くパスを含むと同じ値が含まれます。REQUEST_FILENAMEREQUEST_URI

上記のリンク先のページからの引用:

サーバーごとのコンテキストで使用される場合(つまり、要求がファイルシステムにマップされる前)、処理のこの段階ではパスが不明であるため、SCRIPT_FILENAMEおよびREQUEST_FILENAMEに完全なローカルファイルシステムパスを含めることはできません。その場合、両方の変数には最初にREQUEST_URIの値が含まれます。サーバーごとのコンテキストでリクエストの完全なローカルファイルシステムパスを取得するには、URLベースの先読み%{LA-U:REQUEST_FILENAME}を使用して、REQUEST_FILENAMEの最終値を決定します。

ただし、提案されたソリューションは、%{LA-U:REQUEST_FILENAME} 少なくともサーバー上の仮想ホストでは機能しないことがわかりました。RewriteCond行がブロック内で期待どおりに機能することを確認するには、行のVirtualHost前に。を付ける必要がありますDOCUMENT_ROOT

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f

この方法は常に機能します。ドキュメントルートの二重接頭辞を避けるために、ある日が実際のファイル名を返す_URI場合に切り替えます。REQUEST_FILENAME

于 2013-07-25T07:18:19.637 に答える
2

httpd.confにRewriteBaseがありません。そして、.htaccessの何が問題になっていますか?

于 2010-11-30T15:24:18.707 に答える
1

これはこのタイプミスである可能性があります(おそらく「アプリケーション」である必要があります):

RewriteRule ^(?:aplication|modules|system)\b.* index.php/$0 [L]
于 2011-03-08T19:56:55.263 に答える
1

これらのルールを.htaccessファイルではなくメインサーバーのconfファイル(通常はhttpd.conf)に配置する場合は、^ ......atの代わりに^/......を使用する必要があることを忘れないでください。つまり、RewriteRule行の先頭にスラッシュを追加します。

これを確認してください、役立つかもしれません。

于 2011-10-20T03:21:17.887 に答える