我正在尝试部署一个使用 Jekyll 生成的站点,并希望将该站点保存在我服务器上自己的子文件夹中,以使所有内容更有条理。
本质上,我想将 的内容/jekyll
用作根目录,除非在实际的 Web 根目录中存在类似名称的文件。所以类似的东西/jekyll/sample-page/
会显示为http://www.example.com/sample-page/,而类似的东西/other-folder/
会显示为http://www.example.com/other-folder。
我的测试服务器运行 Apache 2.2 并且以下.htaccess
(改编自http://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/
在 Apache 1.3 中解释目录斜杠的最佳方法是什么,其中DirectorySlash
不存在诸如此类的有用工具?如何在/jekyll/
不显示实际 URL 结构的情况下将该目录用作站点根目录?
编辑:
在对 Apache 1.3 进行了大量研究之后,我发现这个问题本质上是Apache 1.3 URL Rewriting Guide中列出的两个不同问题的组合。
我有一个(部分)移动的 DocumentRoot,理论上它会被这样处理:
RewriteRule ^/$ /e/www/ [R]
我还有臭名昭著的“尾随斜线问题”,可以通过设置来解决RewriteBase
(如下面的回复之一所建议的):
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
问题是将两者结合起来。移动文档根目录不(不能?)使用RewriteBase
- 修复尾部斜杠需要(?)它......嗯......</p>