以下代码可以满足您的要求:“如果请求不匹配index.php
或不匹配index.html
“/”(即不匹配)(并且匹配不区分大小写),则提供备用位置”
Order deny,allow
ErrorDocument 404 /404.php
DirectoryIndex index.php index.html
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/index\.(php|html) [NC]
RewriteCond %{REQUEST_URI} !^/$ {NC]
RewriteRule ^.*$ http://example.com/portal/$0 [R=301,L]
我已经使用优秀的在线测试工具http://htaccess.madewithlove.be对此进行了测试
使用以下测试用例:
http://example.com -- no rewrite, second condition not met
http://example.com/ -- ditto
http://example.com/index.html -- first condition not met
http://example.com/index.php -- first condition not met
http://example.com/some/page.html -- rewritten as http://example.com/portal/some/page.html
编辑你说这仍然没有像预期的那样工作;所以我拿出了大枪。通过打开重写引擎对指令所做的一切的“最大日志记录”
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 9
(显然,选择您想要的任何路径),然后在终端窗口中查看日志文件的末尾
tail -f /var/log/apache2/rewrite.log
您可以快速查看哪些地方工作不正常。一些摆弄使我得到了以下代码。它说“如果请求的 URI 只是/index.html
or /index.php
,或者它以 开头/portal
,或者它是空白的,那么不要重定向。
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/index\.(php|html) [NC]
RewriteCond %{REQUEST_URI} !^/portal.*$ [NC]
RewriteCond %{REQUEST_URI} !^/$ [NC]
RewriteRule ^(.*)$ http://example.com/portal$0 [R=301,L]
测试用例对我有用——看看它们是否对你有用!
注意:我在文件中进行了这些更改httpd.conf
,而不是在.htaccess
根目录的文件中。您需要小心,以便.htaccess
甚至读取根目录中的文件 - 默认的 Apache 配置具有Override none
该目录,因此需要一些额外的工作。通过将此配置更改放在httpd.conf
文件中(并发出sudo apachectl restart
命令),您可以避免困难。根据谁托管您的网站以及您拥有什么控制权,这可能不是您的选择。可能会找到解决这个问题的专家superuser.com
而不是SO......但我希望这对你有用。