利用.htaccess绑定主域名到子目录并解决与wordpress的冲突

刚跟朋友们在国外合租了一台Linux主机,速度不错,就是要把博客迁移过来费了点劲,碰到个问题是我的博客是放在blog目录下,我不想通过http://www.gafish.net/blog/来访问,希望是http://www.gafish.net/就能直接访问到blog,但地址又不显示出来,通过百度,找到了合理的解决方案。

利用Linux主机的.htaccess文件重定向网址功能,操作如下:

把如下代码用记事本记下

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?gafish\.net$
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blog/$1
RewriteCond %{HTTP_HOST} ^(www.)?gafish.net$
RewriteRule ^(/)?$ blog/index.php [L]
</IfModule>

保存为文件名是 .htaccess 的无格式文件,上传到服务器根目录下,再打开http://www.gafish.net/ ,非常成功,我很满意。

这时新的问题也冒出来了,我的博客用了伪静态网址,wordpress生成的规则也在.htaccess文件中,代码如下:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

这个规则跟我的主域名跳转规则有冲突,于是我把这段代码剪贴出来保存成一个新的.htaccess文件放到/blog/目录下,再打开博客,非常OK,问题解决。

---------------------

首先得把域名绑定绑定了,比如把dev.ccvita.com解析到211.136.108.190这个IP
其次是在网站管理面板里,为网站绑定dev.ccvita.com
最后编辑配置.htaccess文件,就可以了。如果没有开启.htaccess请访问下面的内容,《Apache之AllowOverride参数详解》:http://www.ccvita.com/281.html

.htaccess文件内容
RewriteEngine on
# 把 ccvita.com 改为你要绑定的域名.
RewriteCond %{HTTP_HOST} ^(www.)?ccvita.com$

# 把 subfolder 改为要绑定的目录.
RewriteCond %{REQUEST_URI} !^/subfolder/

# 不要改以下两行.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 把 dev 改为要绑定的目录.
RewriteRule ^(.*)$ /dev/$1

# 把 ccvita.com 改为你要绑定的域名
# 把 dev 改为要绑定的目录.
# dev/ 后面是首页文件index.php, index.html
RewriteCond %{HTTP_HOST} ^(www.)?ccvita.com$
RewriteRule ^(/)?$ dev/index.php [L]

-----------------------

有些美国空间,可以做多个子站点,但只能做一个主站。可以用.htaccess实现域名绑定到子目录实现多站点。

先设置停靠域将各域名绑定到主机,然后新建目录directory,再编辑根目录下的隐藏文件.htaccess,添加如下规则:
根目录下的.htaccess
# BEGIN Multisite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^(www.)?abc.org$
RewriteCond %{REQUEST_URI} !^/directory/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /directory/$1 
RewriteCond %{HTTP_HOST} ^(www.)?abc.org$
RewriteRule ^(/)?$ directory/index.php [L]
</IfModule>
# END Multisite

此时装在子目录下的站点如果开启静态化,可能会在该目录下创建.htaccess文件来配置重写规则
但是这种情况下访问会出错,会访问到根目录下的index.php
解决办法很简单,列如wordpress增加的规则需要添加下面红色部分(点前后各有一空格):
注:每次重新配置固定链接重写规则后,都要重新按此修改。
 
子目录下的.htaccess
 
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /directory/index.php [L]
</IfModule>
# END WordPress
 
注:如果不是多站点,而只是想把wordpress放在子目录,用原来的顶级域名访问,则只须在后台设置-常规里
WordPress 地址(URL)http://abc.com//directory
站点地址(URL)http://abc.com
-----------------------------------------

Apache之AllowOverride参数详解

通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里。但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override,即:

< Directory /> 
AllowOverride None 
< /Directory>

在 AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。当此指令设置为 All 时,所有具有 “.htaccess” 作用域的指令都允许出现在 .htaccess 文件中。

而对于 URL rewrite 来说,至少需要把目录设置为:

< Directory /myblogroot/> 
AllowOverride FileInfo 
< /Directory>

而对于 URL rewrite 来说,至少需要把目录设置为:

AllowOverride的参数:

AuthConfig

允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。

FileInfo

允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。

Indexes

允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。

Limit

允许使用控制主机访问的指令(Allow, Deny, Order)。

Options[=Option,...]

允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。

------------------------------------

将 WordPress 文件置于独立子目录,同时让访客可以通过根目录访问到

很多人希望在根目录(比如 http://example.com)使用 WordPress,但又不希望让 WordPress 将他们的根目录弄乱。因此,WordPress 允许您在子目录中安装 WordPress,但让访客可以通过根目录访问到它。

WARNING: 多站点用户请注意 -

本方法核心原理是采用了index.php重定向,因此不支持多站点,如下内容对于启用了多站点的用户无效。

将 WordPress 移动到专门的子目录的步骤如下:

  1. 创建用于存放 WordPress 文件的新目录(在本文中将使用 /wordpress 作为例子)。若您在 Linux 上,在 www 目录中运行 mkdir wordpress 命令。您大概还需要运行一次“chown apache:apache”或“chown [您的用户名]:www-data”来使它拥有正确的所有者。
  2. 前往常规设置页面。
  3. 在“WordPress 地址(URL)”处,将其修改为您的 WordPress 核心文件的新位置。例如:http://example.com/wordpress
  4. 在“站点地址(URL)”一栏,保留您原来根目录的位置。如:http://example.com
  5. 点击“保存设置”。(别担心此时看到的错误消息,也不要现在进行测试!不然您大概会得到“文件未找到”之类的错误消息。)
  6. 将您的 WordPress 核心文件移动(剪切)至新位置(刚刚填写的“WordPress 地址”)。
  7. 从您的 WordPress 地址复制(不要剪切!)index.php 和 .htaccess 到根目录(刚刚填写的“站点地址”)。您可能看不到.htaccess 文件,因此您需要设置您的 FTP 客户端,令其显示隐藏的文件。若您没有使用固定链接,那您可能没有 .htaccess文件,请直接进行下一步。若您在 Windows(IIS)服务器上运行 WordPress,同时使用了固定链接,那您也不会有.htaccess,但有 web.config 文件。和上述方法一样,请复制 index.php 到站点的根目录,然后移动(剪切!不是复制!)web.config 到您的根目录。
  8. 使用一个文本编辑器来打开根目录的 index.php
  9. 进行如下更改,然后保存文件。更改这行:
    require('./wp-blog-header.php');
    令其变成(请用您自己的目录名替换“wordpress”):
    require('./wordpress/wp-blog-header.php');      // 核心原理是采用了index.php重定向,因此不支持多站点
  10. 在新位置登录。比如 http://example.com/wordpress/wp-admin/     // 每次登陆需要手动添加 /wordpress
  11. 若您设置了固定链接,请前往“固定链接”管理页面保存一次设置。此时,若有足够的权限,WordPress 会自动为您更新.htaccess 文件。若自动写入失败,页面上会自动显示新的重写(rewrite)条目,请手动编辑您的 .htaccess 文件(和主index.php 在同一个目录下)

参考推荐:

绑定域名到子目录

Apache 虚拟目录和默认首页的设置