我在这里看过很多关于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://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)。
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>
我错过了什么?
答案 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>