【问题标题】:Some advanced functionality of Apache's mod_rewrite?Apache 的 mod_rewrite 的一些高级功能?
【发布时间】:2017-02-09 22:51:28
【问题描述】:

我在Apache2 下有一个网站,可以通过不同的 URL 从外部和内部访问。它必须同时在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下运行时是否可以保留所有三个功能:

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

【问题讨论】:

  • 你可能想改用FallbackResource,试试看。

标签: html apache mod-rewrite


【解决方案1】:

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

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/ 处理程序)。这种行为可以根据具体网站的需要进行调整。

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多