4

基本的にすべてのアクセスを 1 つのページに向ける .htaccess ルールがあり、その時点から PHP で処理します。したがって、それがどのディレクトリにあるかに関係なく、すべての URL がこのスクリプトに渡されます。

私のルートが /project/ ( example.com/project/some/page/where ) だった場合、 /some/page/where は @frontend.php にリダイレクトされます。

RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ @frontend.php

ただし、ページのサブセットを別のハンドラーにプッシュできるようにしたいところまで来ました ( example.com/project/api/page/where ではなく、 example.com/project/some/ のように) API/場所):

RewriteRule ^/api?$ @api.php

問題は、このルールが他のルールより上か下かに関係なく、これが機能しないことです。誰も私がこれを行うことができる方法を提案できますか?

私も試しました:

RewriteRule ^/api(/.*)? @api.php [L]

RewriteCond %{REQUEST_URI} !/api
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ @frontend.php [L]

これはhttp://example.com/project/api/page/で機能しますが、 @frontend.php にプッシュされず、@api.php にプッシュされず、次のようになります。

[Wed Apr 18 10:46:12 2012] [error] [client 127.0.0.1] File does not exist: /www/project/api

編集:

私の最近の試みは:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api(/.*)? @api.php [L]

RewriteCond %{REQUEST_URI} ^api
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$ @frontend.php

これの問題は、URL が api/ 以外で始まる場合 ( example.com/project/test/page/where )、エラーがスローされることです。

[Sat Apr 21 10:50:13 2012] [error] [client 127.0.0.1] File does not exist: C:/xampp/www/projects/frame3/test
4

3 に答える 3

1

問題は、2番目のリクエストがhtaccessに対してもテストされるため、実際には2つのリクエストがあることです。ルールが適合するものは何でもjs/ico/gifがないので。これは、RewriteCondsまたはApacheの{ENV:REDIRECT_STATUS}メカニズムを使用したregileros(より良い)アプローチのいずれかで管理できます。詳細については、この質問を参照してください。

編集: http://playground.rexbooks.com/stackに小さな例を設定しました。「 fehttp://playground.rexbooks.com/stack/api/123456」と入力すると、 api.phpにリダイレクトされます。その他のクエリはすべてfrontend.phpにリダイレクトされます。手がかりは、ファイルが実際に存在するかどうかを確認することでした。私はあなたの他のルールも分割しました。RewriteBaseは私の設定専用です。調整する必要があります。URIを透過的にしないようにするには、書き換え(R)フラグを削除します。これはあなたが求めていたものですか?

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api(/.*)? /api.php [L,R]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !api
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$
RewriteRule (.*) /frontend.php [L,R]
于 2012-04-18T06:17:43.193 に答える
1

次の内容の「@frontend.php」および「@api.php」ファイルを含むディレクトリに .htaccess を配置します。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api @api.php [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ @frontend.php [QSA,L]

これ!-fにより、既存のファイルの書き換えが防止されます。指定された拡張子のみの書き換えを拒否するには、代わりに次の .htaccess を使用します

RewriteEngine On

RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$
RewriteRule ^api @api.php [QSA,L]

RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|pdf|swf|doc)$
RewriteRule ^ @frontend.php [QSA,L]

もちろん、次の行も機能するはずですが、後で使用しない場合、API の後に来るものをキャプチャするポイントは何ですか...

RewriteRule ^api(/.*)? @api.php [L]
于 2012-04-25T10:45:51.533 に答える
0

どうぞ。これらのタイプのルールは私にとってうまくいきました:

  # redirect Drupal urls straight to Drupal (or in your case api.php)
  RewriteRule ^admin/(.*)$ api.php?q=admin/$1 [L,QSA]
  RewriteRule ^admin_menu/(.*)$ api.php?q=admin_menu/$1 [L,QSA]
  RewriteRule ^node/(.*)$ api.php?q=node/$1 [L,QSA]
  RewriteRule ^content/(.*)$ api.php?q=content/$1 [L,QSA]

  # Another way to redirect based on query strings    
  RewriteCond %{QUERY_STRING} ^q=([^&]+)$
  RewriteRule . api.php?q=$1 [L,QSA]

  # if a directory or a file exists, use it directly
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico

  # otherwise forward it to index.php
  RewriteRule . index.php

Drupal / Yii フレームワークのセットアップを統合するためにこれを実行しましたが、非常にスムーズに動作しています。上記のルールを組み合わせることで、作業を進めることができます。

正確な設定についてさらに明確にしたい場合はお知らせください。

于 2012-04-24T15:20:12.390 に答える