0

我在文件中写了很多RewriteRule.htaccess,但是当我从https切换到http页面时出现问题;它不遵循这些规则

注意:本地主机上一切正常,服务器上的问题<----更新

这是我的网站,目前所有链接都按照RewriteRule*显示

例如关于我们的页面链接显示为

http://www.mywebsite.com/about

如果我在login page(打开https)并点击关于我们的页面,那么它会变成下面。

http://www.mywebsite.com/about?slug=about_us

或者如果我点击左侧面板上的任何类别,那么它会出现

http://www.mywebsite.com/auction/category/1?cid=1

注意: 即使鼠标悬停在页面上也会显示重写链接

以下是.htaccess包含所需信息的文件。

IndexIgnore *

RewriteEngine on
Options +FollowSymLinks 
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^auction/category/([0-9]+)/?$ bids.php?cid=$1 [NC]

RewriteRule ^login/?$ login.php [NC]
RewriteRule ^register/?$ register.php [NC]
RewriteRule ^logout/?$ logout.php [NC]

# static pages
RewriteRule ^about/?$ page.php?slug=about_us [NC]

# Rewrite to https
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} /login [OR]
RewriteCond %{REQUEST_URI} /do_login.php     
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L,QSA]

# don't do anything for images/css/js (leave protocol as is)
RewriteRule \.(gif|jpe?g|png|ico|css|js)$ - [NC,L]

# traffic to http:// except some pages
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !(/login|/do_login.php)
RewriteRule ^(.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L,QSA]

注: Here是完整的.htaccess文件

请告诉我我哪里错了/失踪了?

我也有一些困惑

  • 如果我更改重写 URL 的大小写(登录或 lOgin 或 logiN),那么它会给出错误吗?
  • 用 all写[NC,L]是一种好习惯RewriteRule吗?
  • 我应该在什么时候写 [QSA]

更新

在所有答案的建议之后,几乎RewriteRule解决了所有问题,但现在有最后一个问题。

  • /loginURL 总是变成/login.php.

下面是我更新的.htaccess

IndexIgnore *
Options -MultiViews
Options +FollowSymLinks

#mod_rewrite
RewriteEngine on
RewriteBase /

# Rewrite www to non www
RewriteCond %{HTTP_HOST} ^www.%{HTTP_HOST} [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

# minimize the css on all http:// pages
<IfModule mod_rewrite.c>
    RewriteCond %{HTTPS} off
   RewriteRule ^(.*).css$ /csszip.php?file=$1.css [L]
</IfModule>

#switch over http to https

# Rewrite to https
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} off

RewriteCond %{REQUEST_URI} (/login|/do_login)\.php [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# don't do anything for images/css/js (leave protocol as is)
RewriteRule \.(gif|jpe?g|png|ico|css|js)$ - [NC,L]

# traffic to http:// except some pages
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} on

RewriteCond %{REQUEST_URI} !(/login|/do_login)\.php [NC]

RewriteRule ^(.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^login/?$ login.php [NC]
RewriteRule ^register/?$ register.php [NC]
# ...many other rules...with [NC] falg

RewriteRule ^auction/category/([^/.]+)/?$ bids.php?cid=$1 [NC]
RewriteRule ^about/?$ page.php?slug=about_us [NC]
# ...many more rules.... with [NC] flag
4

4 回答 4

4

HTTPS 建议

对于您的 HTTPS 问题,我将匹配端口或 HTTPS,因为存在与 HTTPS 标签相关的已知 apache 问题。

涵盖两者的匹配(如您编辑的答案所示)

RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} != on

##REWRITE RULE

RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} = on

##REWRITE RULE

一个有效的点也是%{REQUEST_URI}不受任何替换的影响。

您目前使用它的方式,如果任何规则匹配,您会将它们发送到原始 url(在任何替换开始之前)。

如果您想在替换和匹配之后使用 url$1


回答您的其他问题

如果我更改了重写 URL 的大小写,那么它会给出错误吗?

这是因为您[NC]不在 .htaccess 的 HTTPS 部分的重写条件下

你匹配RewriteCond %{REQUEST_URI} /login [OR]这只是寻找小写登录,如果你想接受大写登录追加NC。


用所有 RewriteRule 编写 [NC,L] 是一种好习惯吗?

不,这取决于您要做[NC]什么说不匹配此规则的大小写,如果您不想在该规则(或条件)上匹配大小写,则添加它。

不匹配大小写[NC]意味着 site.com/login.php = sYte.cOm/LoGin.PHP

[L]意味着如果这是真的,停止处理一切


我应该在什么时候写 [QSA] ?

QSA 适用于您有 ? 在您的替换中,您想将旧字符串附加到新 URL

考虑以下规则:

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

使用该[QSA]标志,请求/pages/123?one=two将被映射到/page.php?page=123&one=two. 如果没有 [QSA] 标志,相同的请求将被映射到/page.php?page=123- 也就是说,现有的查询字符串将被丢弃

如果您想保留任何额外的 get 参数,请使用 QSA。


另一个问题

/login URL 总是变成 /login.php

发生这种情况的唯一方法是如果您[R=301]在代码中的某处有重定向,我唯一能看到的地方就是这一部分:

# Rewrite to https
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} != on
RewriteCond %{REQUEST_URI} (/login|/do_login)\.php [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

这将与以下 URL 匹配

.php、/login.php、/do_login.php

我相信罪魁祸首正如我在第一个回应中概述的那样%{REQUEST_URI}

您的代码本质上是说,如果满足这些条件,请将它们发送到https://theurltheywentto,这不是您想要做的,您希望将它们发送到 /login。

您是否尝试过使用(如我的 https 部分所述)

RewriteRule ^(.*) https://%{HTTP_HOST}/login [R=301,L]

或者也许(如果你有 /do_login)和其他选项

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

其中 test.com/do_login.php 将变为https://test.com/do_login

你试试怎么样:

# Rewrite to https
RewriteCond %{REQUEST_URI} (/login|/do_login)\.php [NC]
RewriteCond %{HTTPS} != on
RewriteRule ^(.*)\.php https://%{HTTP_HOST}/$1 [R=301,L]
于 2012-09-18T11:23:46.053 回答
1

我想这可能对你有帮助

.htaccess 将 https 重定向到 http 不起作用

对于最后一个问题,这可能对您有所帮助

http://httpd.apache.org/docs/current/rewrite/flags.html

http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/

编辑: 您可以尝试使用

RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{SERVER_PORT} !^443$

代替

RewriteCond %{HTTPS} on [NC]
RewriteCond %{HTTPS} off [NC] 

详情

请看这个链接,有人遇到过类似的问题。请看帖子的第二个回复

http://www.webmasterworld.com/apache/3228459.htm

于 2012-09-13T07:06:41.767 回答
1

您可以通过创建域别名来解决此问题

您不能在 中执行此操作.htaccess,但在某个http.conf <VirtualHost>部分中您可以使用ServerNameandServerAlias指令来完成此操作。

于 2012-09-17T06:19:55.950 回答
0

您对 /about 的困惑是由于重定向到 %{REQUEST_URI},在您进行替换时不会更改。捕获 URI 并使用 $1 如果您真的不想要该 URI,因为它在这一轮重写处理中开始。

于 2012-09-17T13:03:34.703 回答