web-dev-qa-db-ja.com

Apache 1.3のhtaccessでルートとしてサブディレクトリを使用する

Jekyllで生成されたサイトをデプロイしようとしています。サイトをサーバー上の独自のサブフォルダーに保持して、すべてをより整理しておきたいと思います。

基本的に、同じ名前のファイルが実際のWebルートに存在しない限り、/jekyllのコンテンツをルートとして使用します。したがって、/jekyll/sample-page/のようなものは http://www.example.com/sample-page/ と表示され、/other-folder/のようなものは http: //www.example.com/other-folder

私のテストサーバーはApache 2.2を実行し、次の.htaccesshttp://Gist.github.com/97822 から変更)は問題なく動作します。

RewriteEngine On

# Map http://www.example.com to /jekyll.
RewriteRule ^$ /jekyll/ [L]

# Map http://www.example.com/x to /jekyll/x unless there is a x in the web root.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/jekyll/
RewriteRule ^(.*)$ /jekyll/$1

# Add trailing slash to directories without them so DirectoryIndex works.
# This does not expose the internal URL.
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !/$
RewriteRule ^(.*)$ $1/

# Disable auto-adding slashes to directories without them, since this happens
# after mod_rewrite and exposes the rewritten internal URL, e.g. turning
# http://www.example.com/about into http://www.example.com/jekyll/about.
DirectorySlash off

ただし、私の運用サーバーはApache 1.3を実行しており、DirectorySlashは許可されていません。無効にすると、内部リダイレクトの過負荷のため、サーバーで500エラーが発生します。

ReWriteCondsとルールの最後のセクションをコメントアウトした場合:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !/$
RewriteRule ^(.*)$ $1/

…すべてがほとんど機能します: http://www.example.com/sample-page/ は正しいコンテンツを表示します。ただし、末尾のスラッシュを省略した場合、アドレスバーのURLは実際の内部URL構造を公開します。 http://www.example.com/jekyll/sample-page/

DirectorySlashのような便利なツールが存在しないApache 1.3でディレクトリのスラッシュを説明する最良の方法は何ですか?実際のURL構造を明らかにせずに、/jekyll/ディレクトリをサイトルートとして使用するにはどうすればよいですか?

編集:

Apache 1.3に関する大量の調査の結果、この問題は本質的に Apache 1.3 URL Rewriting Guide にリストされている2つの異なる問題の組み合わせであることがわかりました。

私は(部分的に)移動したDocumentRootを持っています。これは理論的には次のようなもので処理されます。

RewriteRule   ^/$  /e/www/  [R]

悪名高い "Trailing Slash Problem"もあります。これは、RewriteBaseを設定することで解決します(以下のいずれかの応答で提案されています)。

RewriteBase    /~quux/
RewriteRule    ^foo$  foo/  [R]

問題は2つを組み合わせることです。ドキュメントルートの移動ではRewriteBaseは使用できません(使用できませんか?)—末尾のスラッシュを修正する必要があります(?)それは…ふむ…

28
Andrew

1週間試してみて、ようやく手に入れました。 RewriteRulesは本当にブードゥー教です…

RewriteEngine On

# Map http://www.example.com to /jekyll.
RewriteRule ^$ /jekyll/ [L]

# Map http://www.example.com/x to /jekyll/x unless there is a x in the web root.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/jekyll/
RewriteRule ^(.*)$ /jekyll/$1

# Add trailing slash to directories within jekyll
# This does not expose the internal URL.
RewriteCond %{SCRIPT_FILENAME} -d
RewriteRule ^jekyll/(.*[^/])$ http://www.example.com/$1/ [R=301]

DirectorySlashは必要ありません。それはすべて魔法のように機能します。

59
Andrew

あなたは単に使うことができます:

RewriteBase   /jekyll

そして、すべてはその時点から始まります。

12
Marcos Placona

私のために働いた唯一の簡単な解決策は here です

RewriteEngine on
RewriteCond %{HTTP_Host} ^domain-name.com$ [NC,OR]
RewriteCond %{HTTP_Host} ^www.domain-name.com$
RewriteCond %{REQUEST_URI} !folder/
RewriteRule (.*) /folder/$1 [L]

このコードを.htaccessファイルに入れます。

1
Umair Hamid