2014-11-14 101 views
2

我有一个.htaccess它做了基本重写它看起来像下面这样:PHP现代重写

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) index.php?url=$1 [L,QSA] 

下一个条件是从URL中移除www.,看起来像这样:

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

问题是,当我打电话给一个链接,如:

http://somesite.com/category/subcategory/?id=123 

并添加www.手动,重写URL这样:

http://www.somesite.com?url=category/subcategory/?123 

页剧照负载,但是,我已经被告知这是可怕的搜索引擎优化。任何想法如何解决这个问题?

+0

您的框架或CMS中是否有其他'.htaccess'规则?你使用的是什么框架或CMS?请发布完整的'.htaccess',以便我们看到您按照何种顺序放置规则。 – Prix 2014-11-14 13:50:49

+0

这不是一个实际的框架。在一个小项目上工作。是的,这就是htaccess中的所有规则。 – Jay 2014-11-14 13:53:15

+0

您是否尝试在.htaccess中更改此规则的位置?首先“删除”万维网,然后重写SEO炒炸弹? – newman 2014-11-14 14:12:20

回答

3

您当前的问题是,你有你的主要搜索引擎的规则后,您WWW重定向,这是幕后发生的事情:

  1. 您访问http://somesite.com/category/subcategory/?id=123
  2. 你的规则,它在内部重定向到index.php?url=category/subcategory/?id=123
  3. 你的最后一条规则是在没有www的情况下重定向,也将发生并最终将其重定向到:

    http://somesite.com/?url=category/subcategory/?id=123 
    

为了解决这个问题,你会需要你的规则如下:

RewriteEngine on 

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

RewriteRule ^index.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) index.php?url=$1 [L,QSA] 

这让我们想到你的第二个问题,你已经使用301重定向等等您浏览器缓存了一些重定向您需要暂时使用其他浏览器来测试您的更改,最好还有一个尚未用于访问该网站的更改,同时清除该浏览器的缓存并等待它完全清除。

一旦您的默认浏览器的缓存已清除,您可以像往常一样使用它,你应该得到相同的响应。

+1

一个很好的解释。我将添加到OP中,一条好的经验法则是在重写之前(您将请求静静地传递到新的目标端点)执行重定向(实际上在浏览器中更改URL的位置)。 – 2014-11-14 14:52:50

+0

@MikeBrant:P你描述得比我想的要好。 – Prix 2014-11-14 14:55:51

+0

感谢您花时间研究它。那是(y)! – Jay 2014-11-14 15:06:24