Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 在匹配URI Slug上启用SSL时重定向循环_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache 在匹配URI Slug上启用SSL时重定向循环

Apache 在匹配URI Slug上启用SSL时重定向循环,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我试图通过mod_rewrite完成两项任务: 如果URL(无论协议如何)没有www子域,则将www添加到URL 如果URI以/secure.php开头,并且协议不是https,则将协议切换到https 所以我试着: # Redirect to www subdomain RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] # Force SSL for secure.

我试图通过mod_rewrite完成两项任务:

如果URL(无论协议如何)没有www子域,则将www添加到URL

如果URI以/secure.php开头,并且协议不是https,则将协议切换到https

所以我试着:

# Redirect to www subdomain
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Force SSL for secure.php URIs
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure.php
RewriteRule ^(.*)$ https://www.mysite.com%{REQUEST_URI} [R=301,L]
但是当访问/secure.php URI时,我会得到一个重定向循环。我不知道问题出在哪里,这就是我对事件顺序的看法:

请求 主机名不包含www,因此它通过了第一个条件 URL将更新为,流程将循环回顶部。 主机名确实包含www,因此它不满足第一个条件并跳过重写。 HTTPS已关闭,因此它符合下一个条件,并且 URI以/secure.php开头,因此它匹配两个必需条件 URL将更新为,流程将循环回顶部。 主机名确实包含www,因此它不满足第一个条件,并跳过重写。 HTTPS未关闭,因此无法满足下一个条件并跳过重写。 我说得对吗?我做错了什么

在.htaccess中,我还有一条从ExpressionEngine URL中删除index.php的规则:

RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
下面是整个.htaccess文件:

RewriteEngine On
RewriteBase /

# Remove index.php from ExpressionEngine URIs
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

# Redirect to www subdomain
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Force SSL for /secure.php URIs
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure.php
RewriteRule ^(.*)$ https://www.mysite.com%{REQUEST_URI} [R=301,L]
服务器变量(如HTTP_主机或请求_URI)在RewriteCond中可用,但在REWRITE规则中不可用。如果您需要这些变量,您必须立即捕获它们

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} (.+)
RewriteRule .* http://www.%1/$0 [R,L]
您不需要在RewriteCond中检查secure.php,只需在RewriteRule中指定它即可

RewriteCond %{HTTPS} off
RewriteRule ^/?(secure.php.*) https://www.mysite.com/$1 [R,L]

OT:切勿在启用301的情况下进行测试,详细信息请参见此答案。

您的事件顺序非常接近,但在我看来,这与本例无关,因为您的结论是正确的。我也看不出循环的任何原因。这就是全部还是有更多的规则?如果仅此而已,RewriteEngine和RewriteBase指令在哪里?是否启用了FollowSymlinks,即选项+FollowSymlinks?我设置了RewriteEngine,但没有RewriteBase。未通过.htaccess文件启用FollowSymlinks-不确定服务器本身。文件中还有一条规则,我已将其添加到问题中。您添加到问题中的最后一条规则集在哪里,在其他规则之前还是之后?请按原始顺序排列,包括所有指令。我已将完整的.htaccess文件添加到我的问题中,并添加了RewriteBase-谢谢!谢谢奥拉夫的帮助。我尝试了您的代码,但仍然在/secure.php URL上得到一个重定向循环。@kgrote我看不出这是如何发生的,除非您有其他冲突的规则。如果您有权访问apache配置文件,则可以激活RewriteLog以查看哪里出了问题。