使用mod_rewrite从example.com/dir重定向到www.example.com/dir

时间:2010-12-26 12:28:38

标签: apache .htaccess mod-rewrite redirect

假设/是我的域example.com的文档根目录。

/.htaccess

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

/dir/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /dir/index.php [L]
</IfModule>

我知道如何将example.com/dir重定向到www.example.com/dir,因为/.htaccess完成了这项工作。

然而,这里的诀窍是,如果你知道我的意思,我必须保持/dir/.htaccess提供虚拟目录(例如/dir/state/AK/35827/不是实际目录)。

问题是,如果我保留/dir/.htaccess,请求:

http://example.com/dir/state/AK/35827/

不会重定向到:

http://www.example.com/dir/state/AK/35827/

就像:

http://example.com/

重定向到:

http://www.example.com/

不确定我是否说清楚了。

基本上,如何让http://example.com/dir/state/AK/35827/正确地重定向到http://www.example.com/dir/state/AK/35827/并且我可以提供虚拟网址?

2 个答案:

答案 0 :(得分:1)

如果您确实可以访问apache VirtualHosts配置,那么您需要:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

这会成功将http://example.com/重定向到http://www.example.com/http://example.com/dir/state/AK/35827/http://www.example.com/dir/state/AK/35827/

答案 1 :(得分:0)

&#34;问题&#34;这是mod_rewrite没有&#34;继承&#34;父配置(.htaccess)默认情况下。子目录中的mod_rewrite指令完全覆盖父目录中的mod_rewrite指令(与其他模块不同)。

您需要:

  • 将规范www重定向从父.htaccess文件复制到/dir/.htaccess。但是代码重复是不可取的。

  • OR:在子.htaccess文件中启用mod_rewrite继承:

    RewriteOptions inherit
    

    这有效地&#34;复制&#34;来自父.htaccess文件的mod_rewrite指令。但是,如果您有其他指令,则可能无法按预期工作。请注意,这&#34;复制&#34;指令,不改变目录前缀。

  • OR:执行父.htaccess文件中的所有操作。拥有一个.htaccess文件可能是首选解决方案。例如:

    RewriteEngine on
    
    # Canonical redirect
    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
    
    # Virtual directories...
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^dir/ dir/index.php [L]