重定向,代理和RewriteEngine

时间:2014-07-08 16:04:49

标签: regex apache .htaccess mod-rewrite redirect

我的网站(www.example.com)有.htaccess个文件:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule ^/sub/(.*)$ http://sub.example.com/$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^sub\.example\.com$
RewriteCond %{REQUEST_URI} !^/sub/
RewriteRule ^(.*)$ /sub/$1 [L]

文件夹结构与此类似:

/ root
| .htaccess
| index.php
| / sub
| | more.html
| | cats.jpeg
| | / folder
| | | index.php

.htaccess文件应该做的是:

  • 打开/sub/cats.jpeg时服务sub.example.com/cats.jpeg(但不要重定向,作为代理)
  • 将对/sub/*的任何访问权限重定向(301)至sub.example.com/*

现在这种方法很有效,但有时会失败:

  • sub.example.com/folder转到sub.example.com/sub/folder/
  • sub.example.com/folder/按预期工作

为什么呢?你们能帮助我吗?提供更好的解决方案?

1 个答案:

答案 0 :(得分:1)

嗯,这有点棘手的问题。我不得不重新创建这个目录结构来调查发生了什么。

这实际上是由于mod_dir播放了spoilsport。 mod_dir检测Request URI是否为目录,如果URI缺少,则添加尾部斜杠。

您正在请求/folder而没有斜杠。您的重写规则将其重新归结为/sub/foldermod_dir301重定向到/sub/folder/。显然,当您请求sub.example.com/folder/时,mod_dir将不会执行任何操作,因为它已在重写的URI sub.example.com/sub/folder/

中有一个尾部斜杠

要解决此问题,请遵循以下规则:

RewriteEngine On

RewriteRule ^sub(/.*)?$ http://sub.example.com$1 [NE,NC,L,R=302]

# adds a trailing slash if rewritten URI is a directory
RewriteCond %{DOCUMENT_ROOT}/sub%{REQUEST_URI} -d
RewriteCond %{HTTP_HOST} ^sub\.example\.com$
RewriteRule ^((?!sub/).*)$ /sub/$1/ [L,NC]

# just rewrite to /sub/<uri>    
RewriteCond %{HTTP_HOST} ^sub\.example\.com$
RewriteRule ^((?!sub/).*)$ /sub/$1 [L,NC]