繁体   English   中英

Apache mod_rewrite的某些高级功能?

[英]Some advanced functionality of Apache's mod_rewrite?

我有一个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上运行
  • 显示针对无效请求的自定义错误页面
  • 在地址栏中保留原始请求

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

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/处理程序)。 可以根据特定网站的需要调整此行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM