htaccess中的简单rewritecond不能按预期工作

时间:2018-11-28 02:40:05

标签: .htaccess

这非常简单,但是却让我发疯!我在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

2 个答案:

答案 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。

     

如果文件已被重定向,则此魔术条件将不会处理全部捕获。