2

開発テスト用の動的なアプリケーション提供フレームワークをセットアップしようとしています。

私の望ましい結果は、ユーザーがURLにアクセスするときに、URLが次のようにフォーマットされているhostname.com/somecategory/someapplicationname/hostname.com/somecategory/someapplicationname(末尾にスラッシュがない場合)、カテゴリとアプリケーション名が次のように存在する限り、データベースから要求されたアプリケーションをユーザーに提供する必要があることです。かぎ。

一部のアプリケーションがデータベースになく、同じURLのファイルに存在するという特殊なケースがあるため、既存のファイルをどのデータベースレコードよりも優先して提供します。

データベースからの動的コンテンツの場合は正常に機能します。既存のファイルの場合は、最後にスラッシュがある場合にのみ100%機能します。スラッシュがない場合は、適切なファイルが提供されますが、URLはかなり奇妙に見えます。次のように表示されます。hostname.com/somecategory/someapplicationname/?category=somecategory&appname=someapplicationname
つまり、機能しますが、予期しない出力により、ソリューションが完全ではないと感じます。

私はapachemod_rewriteを使用していますが、.htaccessファイルは次のとおりです。

RewriteEngine on
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ route.php?category=$1&appname=$2 [NC,L] 

この場合に固有のPHPコードは次のとおりです。読みやすくするために、このスニペットから検証とデータベース接続を削除しましたが、この特定のケースのロジックは保持されています。

$file = $_SERVER['DOCUMENT_ROOT'] . $_GET['category'] . "/" . $_GET['appname'] . "/index.php";
$fileNoPHP = $_SERVER['DOCUMENT_ROOT'] . $_GET['category'] . "/" . $_GET['appname'] . "/index.html";
$_fileExists = file_exists($file);
$_fileNoPHPExists = file_exists($fileNoPHP);
include_once($_fileExists ? $file : $fileNoPHP);

明確にするために、私の質問は次のとおりです。末尾のスラッシュがない場合にのみ、既存のファイルケースがURLの末尾にGETパラメータを追加するのはなぜですか?

御時間ありがとうございます。さらに詳しい情報が必要な場合は、お知らせください。お知らせします。

4

1 に答える 1

3

あなたが持っているルールは、奇妙に見えるURLを引き起こしているものではありません:

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ route.php?category=$1&appname=$2 [NC,L] 

これで問題ないはずです。どこかで、そのリンクを生成するか、ブラウザをそのリンクにリダイレクトしています。次のようなルールがある場合:

RewriteRule route.php /%1/%2/ [R=301,L]

?最後にaを追加して、クエリ文字列を削除する必要があります。

RewriteRule route.php /%1/%2/? [R=301,L]

または、Apache 2.4を使用している場合はQSD、角かっこにフラグを含めます。

それでも解決しない場合は、末尾のスラッシュが確実に追加されるようにルールを追加する必要がありますが、DirectorySlashリダイレクトの問題である可能性があります(オフにすることができます)。

于 2012-08-05T05:40:11.490 に答える