在所有页面均为强制HTTPS的站点中的单个页面上强制HTTP(无SSL)

时间:2019-02-12 06:50:19

标签: .htaccess

我知道有几条帖子询问完全相同的事情。我已经阅读了每一个问题,并尝试了解决方案,所以我再次问了同样的问题。也许他们是为O.Ps的代码工作的,但不幸的是,这些代码对我的代码没有作用。

真的需要在一个名为play.php的PHP页面上禁用HTTPS,以便可以通过直接HTTP访问该页面,或者如果通过HTTPS直接请求,则可以重定向到HTTP。

>

我需要将https://example.com/play/blabla更改为http://example.com/play/blabla,同时将网站的其余部分强制设置为HTTPS。

这是我完整的.htaccess代码:-

Header set Access-Control-Allow-Origin "*********"

ErrorDocument 404 /pagenotfound.php
ErrorDocument 403 /pagenotfound.php

Options -MultiViews
RewriteEngine on
RewriteBase /

Options +FollowSymLinks

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteRule ^search/(.*)$ viewgames.php?search=$1 [L,QSA,NC]
RewriteRule ^category/(.*)$ viewgames.php?cat=$1 [L,QSA,NC]
RewriteRule ^users/(.*)$ users.php?action=$1 [L,QSA,NC]
RewriteRule ^play/(.*)/$ play.php?gn=$1 [L,QSA,NC]
RewriteRule ^play/(.*)$ play.php?gn=$1 [L,QSA,NC]

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^([a-z]+)/?$ $1.php [L,NC]

我有一个名为play.php的脚本,该脚本使用.htaccess重写为/play/,即如果有人请求example.com/play/foobar,该请求将发送到example.com/play.php?gn=foobar

我对.htaccess非常陌生。非常感谢您的帮助。

[编辑] 我已经更新了上面的代码,以显示完整的.htaccess。希望对您有所帮助。顺便说一句,代码第一行中的星号(*)是隐藏我的实际网站地址。

2 个答案:

答案 0 :(得分:1)

这里是完整的.htaccess,并附有我的评论:

Header set Access-Control-Allow-Origin "*********"

ErrorDocument 404 /pagenotfound.php
ErrorDocument 403 /pagenotfound.php

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteBase /

# it is important to keep www removal rule as first rule to avoid multiple redirects
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L,NE]

# http->https if URL is not starting with /play/ or /play.php
RewriteCond %{HTTPS} !on
RewriteRule !^play(?:\.php|/.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE,NC]

# https->http if URL is starting with /play/
RewriteCond %{HTTPS} on
RewriteRule ^play(?:/.*)?$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE,NC]

RewriteRule ^search/(.*)$ viewgames.php?search=$1 [L,QSA,NC]

RewriteRule ^category/(.*)$ viewgames.php?cat=$1 [L,QSA,NC]

RewriteRule ^users/(.*)$ users.php?action=$1 [L,QSA,NC]

RewriteRule ^play/(.+?)/?$ play.php?gn=$1 [L,QSA,NC]

# make sure to check for presence of .php file before rewrite
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([a-z]+)/?$ $1.php [L,NC]

完全清除浏览器缓存或使用新的浏览器测试更改很重要。

答案 1 :(得分:0)

您可以使用以下https

play.php禁用到RewriteRule URI中
RewriteEngine on
RewriteCond ℅{REQUEST_URI} play\.php$ [OR]
RewriteCond ℅{REQUEST_URI} /play
RewriteCond ℅{HTTPS} on
RewriteRule ^ http://℅{HTTP_HOST}℅{REQUEST_URI} [L,NE,R]

这会将https://example.com/play.php重定向到其非SSL版本。 由于您的规则已经检查了http网址,因此您也可以在规则中添加一个条件,以将play.php从HTTPS重定向中排除,如下所示:

 RewriteCond %{HTTPS} off
 #redirect all to https except /play and /play.php 
 RewriteCond %{REQUEST_URI} !play
 RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]