htaccess 301重定向不工作 [英] htaccess 301 redirect not working

查看:155
本文介绍了htaccess 301重定向不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在向codeigniter网站的.htaccess文件添加一个简单的301规则。

  redirect 301 / newsletter http://sub.domain.com/newsletters/may2010 

当我访问 http:/ /sub.domain.com/newsletter 重定向到

  http://sub.domain.com/ newsletter / may2010 /?/ newsletter 

我不知道?完整的.htaccess文件:

 < IfModule mod_rewrite.c> 
RewriteEngine On
RewriteBase /

redirect 301 / newsletter http://sub.domain.com/newsletters/may2010

#Removes访问系统文件夹。
#另外,这将允许您创建一个System.php控制器,
#previously这是不可能的。
#'system'可以替换,如果你已经重命名您的系统文件夹。
RewriteCond%{REQUEST_URI} ^ system。*
RewriteRule ^(。*)$ /index.php?/$1 [L]

#检查用户是否尝试访问一个有效的文件
#s如一个图像或CSS文档,如果这不是真的,它发送
#request到index.php
RewriteCond%{REQUEST_FILENAME}! - f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteRule ^(。*)$ index.php?/ $ 1 [L]
< / IfModule>



< IfModule!mod_rewrite.c>
#如果我们没有安装mod_rewrite,所有404的
#都可以发送到index.php,一切正常。
#提交者:ElliotHaughin

ErrorDocument 404 /index.php
< / IfModule>

########################################## ###########
#配置媒体缓存

头文件未设置ETag
FileETag无
< FilesMatch(^ i)^ 。* \。(ico | flv | jpg | jpeg | png | gif | js | css)$>
头文件未设置Last-Modified
头文件集ExpiresFri,21 Dec 2012 00:00:00 GMT
Header set Cache-Controlpublic,no-transform
< ; / FilesMatch>

######################################### ############

< IfModule mod_deflate.c>
< FilesMatch\。(js | css)$>
SetOutputFilter DEFLATE
< / FilesMatch>
< / IfModule>

如何解决这个问题?

解决方案

嘿,这是Apache拉扯一个鬼祟的处理顺序的伎俩你。事实证明,将 Rewrite 命令放在文件的顶部并不意味着它首先是实际执行的。而是会先运行 mod_rewrite ,然后运行 mod_alias (负责处理<$ c $ > )。 c>



 通讯 - > index.php?/ newsletter 

mod_rewrite将查询字符串设置为?/ newsletter ,但因为您没有指定 PT 标志, >不是将重写的网址 index.php 转移到 mod_alias 。因此, mod_alias 仍然会看到 / newsleter 路径,将它重定向到 http:// sub .domain.com / newsletters / may2010 ,并将(现已更改的)查询字符串?/ newsletter 添加到结尾以封闭交易。有趣的东西,对吗?



无论如何,这种情况下的快速修复将是忽略只是通讯

 #检查用户是否尝试访问有效的文件
#s如图像或css文件,如果这不是真的,它发送
#request到index.php
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteCond%{REQUEST_URI}!newsletter $
RewriteRule ^(。*)$ index.php?/ $ 1 [L]


I'm trying to add a simple 301 rule to the .htaccess file of a codeigniter site.

redirect 301 /newsletter http://sub.domain.com/newsletters/may2010

When I visit http://sub.domain.com/newsletter the redirect goes to

http://sub.domain.com/newsletters/may2010/?/newsletter

I'm not sure where the ?/newsletter is coming from. Full .htaccess file:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /    

    redirect 301 /newsletter http://sub.domain.com/newsletters/may2010

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>



<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

#####################################################
# CONFIGURE media caching
#
Header unset ETag
FileETag None
<FilesMatch "(?i)^.*\.(ico|flv|jpg|jpeg|png|gif|js|css)$">
Header unset Last-Modified
Header set Expires "Fri, 21 Dec 2012 00:00:00 GMT"
Header set Cache-Control "public, no-transform"
</FilesMatch>
#
#####################################################

<IfModule mod_deflate.c>
<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>

How can I fix this?

解决方案

Heh, this is Apache pulling a sneaky order-of-processing trick on you. As it turns out, the fact that you put your Rewrite command at the top of the file doesn't mean that it's what's actually executed first. What happens instead is that mod_rewrite is run first, followed by mod_alias (which is responsible for handling your Rewrite).

This results in the following transformation, per mod_rewrite:

newsletter --> index.php?/newsletter

mod_rewrite happily sets the query string to ?/newsletter, but because you don't have the PT flag specified, does not passthrough the rewritten URL index.php to mod_alias. Therefore, mod_alias still sees the /newsleter path, redirects it to http://sub.domain.com/newsletters/may2010, and appends the (now changed) query string ?/newsletter to the end to seal the deal. Fun stuff, right?

Anyway, a quick-fix for this scenario would be to ignore requests for just newsletter:

#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !newsletter$
RewriteRule ^(.*)$ index.php?/$1 [L]

这篇关于htaccess 301重定向不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆