这非常简单,但是却让我发疯!我在http://example.org/有一个网站,在http://example.org/ccc/有一个子目录
我想将/ ccc /目录中之外的所有内容重定向到另一个网站。
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/ccc/?.*
RewriteRule ^(.*)$ https://new-website.com/$1 [L]
但是此代码不起作用,它重定向/ ccc /目录。根据我对this htaccess tester的研究和测试,它不应重定向,因为RewriteCond正在/ ccc后面加上可选的斜杠和其他字符。
发生了什么事?这看起来正确吗?
编辑:来自this answer的此方法也不起作用,正在重定向CCC域:
RewriteEngine on
RewriteRule ^ccc index.php [L]
RewriteRule (.*) https://new-website.com/$1 [R=301,L]
PHP 5.4.45,Apache / 2.2.31
答案 0 :(得分:1)
假设ccc/
目录没有单独的.htaccess,则可以使用以下规则:
RewriteEngine on
RewriteCond %{THE_REQUEST} !\s/ccc[/?\s] [NC]
RewriteRule ^ https://new-website.com%{REQUEST_URI} [L,R=301,NE]
THE_REQUEST
变量表示Apache从您的浏览器收到的原始请求,并且在执行其他重写指令后不会被覆盖。此变量的示例值为GET /index.php?id=123 HTTP/1.1
答案 1 :(得分:0)
[L]似乎运行不正常,我猜它是Apache(2.2.31)的旧版本,因为这些规则在单独的网站上有效。我发现this solution似乎适用于这种情况,下面第三行:
RewriteEngine on
RewriteRule ^ccc/? index.php [L]
RewriteCond %{ENV:REDIRECT_STATUS} != 200
RewriteRule ^(.*)$ https://new-website.com/$1 [L]
该问题的解释:
问题在于,一旦处理完[L]标志,所有下一个RewriteRules确实都会被忽略,但是,文件从头开始重新处理,现在使用新的url。
如果文件已被重定向,则此魔术条件将不会处理全部捕获。