假设/
是我的域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/
并且我可以提供虚拟网址?
答案 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]