htaccess mod_rewrite与WWW结合使用。重定向问题

时间:2015-06-03 12:17:32

标签: .htaccess mod-rewrite redirect

我在这里看过很多关于mod_rewrite和非www的帖子。到www。站点。我的组合有问题。这些规则在不同的网站/服务器上为我独立工作

我对WWW的标准力量。规则是:

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]  

但是我将这个与mod_rewrite结合起来转一个地址:

www.site.com/folder1/folder2 

成:

www.site.com/category.php?catcode=folder1&pagetype=folder2 

这个代码是:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]*)/([^/]*)/?$ /view_category.php?catcode=$1&page=$2 [NC,L]

这两个代码部分都可以自行运行,但是当我尝试访问此地址时出现问题:

http://example.com并返回:

http://www.example.com/view_category.php?catcode=http:&page=www.example.com

这显然是不可接受的。应该实现的是:

http://www.example.com [/index.php]

为什么这不会将重定向301视为[L] ast请求?

我已阅读/尝试过的事情:

htaccess www redirect for seo friendly url

htaccess non-www. to www redirect AND request rewrite to index.php

此外,我还尝试定义mod_rewrite规则仅适用于www。只有,所以:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^www.%{HTTP_HOST}([^/]*)/([^/]*)/?$ www.%{HTTP_HOST}/view_category.php?catcode=$1&page=$2 [NC,L]

但这不会改变行为。 www。重定向工作但是当没有www时它会继续尝试加载mod_rewrite。 ,地址 http://example.com/ 做同样的事情,但地址 http://www.example.com http://www.example.com/ 都表现得很好对我来说,看起来问题不是特别是mod_rewrite。

我也尝试用 [L] 代替 [END] ,但结果没有差异。

(我也试过删除options -indexes只是为了看,但这也没有改变。)

该过程在按预期使用时效果很好,http://example.com/folder1/folder2正确重定向(至http://www.example.com/folder1/folder2)。

我的.htaccess:

ErrorDocument 400     /error/400.php
ErrorDocument 401     /error/401.php
ErrorDocument 403     /error/403.php
ErrorDocument 404     /error/404.php
ErrorDocument 500     /error/500.php
Options -Indexes
RewriteEngine On

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/?$ /view_category.php?catcode=$1&page=$3 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]*)/([^/]*)/?$ /view_category.php?catcode=$1&page=$2 [NC,L]

<Files php.ini>
order deny,allow
deny from all
</Files> 

我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果我没弄错的话,您需要将([^/]*)更改为([^/]+)

你正在使用的那个使它匹配0个或更多个字符,而替代方案使它匹配1个或多个字符。

由于您已将结尾斜线设为可选,因此对域根目录的请求将与([^/]*)/([^/]*)/?$匹配。

因此,您的文件现在应该如下所示:

ErrorDocument 400     /error/400.php
ErrorDocument 401     /error/401.php
ErrorDocument 403     /error/403.php
ErrorDocument 404     /error/404.php
ErrorDocument 500     /error/500.php

Options -Indexes

RewriteEngine On

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /view_category.php?catcode=$1&page=$3 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ /view_category.php?catcode=$1&page=$2 [NC,L]

<Files php.ini>
    Order Deny,Allow
    Deny From All
</Files>