32

我正在尝试部署一个使用 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>

4

3 回答 3

69

经过一周的努力,终于搞定了。RewriteRules 真的是巫毒……</p>

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。它神奇地一切正常。

于 2010-03-14T21:53:29.640 回答
13

您可以简单地使用:

RewriteBase   /jekyll

一切都从那时开始。

于 2010-03-08T14:59:02.113 回答
5

唯一对我有用的简单解决方案是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 文件中。

domain-name.com – 输入您自己的域名

文件夹 - 键入包含测试/开发网站的子文件夹的名称

于 2019-07-30T08:24:24.750 回答