0

html5 pushState() を使用して URL 構造を保持し、信頼性の高いページのリロードなどを容易にする ajax 駆動の Web サイトを構築しています。末尾のスラッシュがなく、いくつかにリダイレクトされます

"domain.com/index.php?page=ディレクトリパス"

したがって、現在、私のリクエストは次のように翻訳されています。

domain.com/Folder => domain.com/index.php?page=Folder

domain.com/Folder/ 、 domain.com/folder、 domain.com/folder/ => (デフォルト、書き換えなし)

これは、私の .htaccess ファイル (ドメイン ルートにある) によって行われ、次のコードがあります。

# Enable Rewriting
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^((/?[A-Z][A-Za-z0-9]*)+[^/])$
RewriteRule ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ index.php?page=$1

「Folder」という名前の空のディレクトリを追加し、ブラウザで「domain.com/Folder」にアクセスするまで、これはうまくいきました。
以前は、「domain.com/Folder」は期待されるコンテンツ (「domain.com/index.php?page=Folder」) を提供し、「domain.com/Folder/」は 404 エラーを提供していました。ドキュメント ルートに「Folder」という名前のディレクトリはありませんでした。

これで、私の予想される結果は次のようになりました:
ブラウザは URL バーに「domain.com/Folder」を表示し、サーバーは「domain.com/index.php?page=Folder」のコンテンツを配信します (「Folder」が存在しない場合と同じ) )

しかし代わりに:
ブラウザは "domain.com/Folder?page=Folder" を表示します

ここで私が間違っていることを誰かが指摘できますか? また、可能であれば、どうすれば修正できますか?

*他のディレクトリに他のhtaccessファイルはありません。
編集:永続的なリダイレクト [R=301] を強制すると、スキームは正常に機能しているように見えますが、残念ながら、ブラウザーのアドレス バーの URL が変更されます。

4

2 に答える 2

1

最後に、私はそれを理解しました!
頭痛の種は、ディレクトリが存在する場合、末尾のスラッシュを黙って追加していた apache の組み込みのDirectorySlash構成が原因でした。だから私はそれをオフにして
それを修正しました。しかし、よく考えてみると、これは実際には便利なリダイレクトであると感じたので、大文字で始まらない他のすべてのディレクトリの末尾にスラッシュを追加するように htaccess をハードコーディングしました。

だからここに私の最終的なhtaccessファイルがあります:

RewriteEngine On
DirectorySlash Off
RewriteBase /
RewriteCond %{REQUEST_URI} ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ 
RewriteRule ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ index.php?page=$1 [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^([a-z0-9][A-Za-z0-9/]*[^/])$ $1/ [R,L]

これが同様の問題を抱えている他の人に役立つことを願っています

于 2012-10-27T11:43:43.167 に答える
0

システム上に存在しないファイルまたはフォルダーを無視するディレクティブがありません。ルールセットの最初にこれを追加してみてください:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

お役に立てれば!

于 2012-10-26T07:57:55.423 に答える