Apache的一些高级功能mod_rewrite?

时间:2017-02-07 12:11:36

标签: html apache mod-rewrite

我在Apache2下有一个网站,可通过不同的网址在外部和内部访问。它必须在example.com/example.com/sites/mysite/都有效。因此,我在HTML中使用相对URL,例如:

../static/css/style.css
../some_other_page.html

为了处理对不存在页面的无效请求(例如example.com/non_existing_page/),我创建了一个自定义错误页面(其中还包含指向该站点其他部分的链接)并使用mod_rewrite来传递那里的要求:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule .* /custom_404_page/ [PT]

因此,用户可以看到精美的自定义页面,而地址栏仍包含原始请求。此规则也可以根据基本URL进行调整。但是,当向子目录(例如example.com/non/existing/page/)发出无效请求时,错误页面会被破坏,因为链接是相对的(例如,../static/css/style.css现在解析为example.com/non/existing/static/css/style.css)。我可以使用[R](重定向)标记而不是[PT]来解决此问题;然而,地址栏也会显示example.com/custom_404_page/,我想避免这种情况。

因此,我想知道在Apache2下运行时是否可以保留所有三个功能:

  • 可以在不同的基本网址上运行
  • 显示无效请求的自定义错误页面
  • 在地址栏中保留原始请求

1 个答案:

答案 0 :(得分:0)

有一种方法,适用于大多数网站:

Define MY_ROOT_BASE /sites/mysite/
Define MY_ROOT_PAGES "(static|index|some_page|some_another_page)"

RewriteEngine On
RewriteCond %{REQUEST_URI} ^${MY_ROOT_BASE}${MY_ROOT_PAGES}/ [NC]
RewriteRule .* - [L]
RewriteRule ^${MY_ROOT_BASE}(.*?/)?${MY_ROOT_PAGES}/(.*)$ ${MY_ROOT_BASE}$2/$3 [NC,R,L]

这将更正包含其中一个根页的名称但不在根位置的所有请求。例如,example.com/sites/mysite/some/rubbish/static/css/style.css将成为example.com/sites/mysite/static/css/style.css。第一条规则是保护引擎免受无限循环的影响。

请注意,如果请求包含多个根页面的名称(例如/index/some_another_page/),它将仅在第一次匹配之前修剪无法识别的URL块(由于非贪婪*?模式)并将请求转发给相应的处理程序(在此示例中为/index/处理程序)。可以根据特定网站的需要调整此行为。