2011-07-13 74 views
0

我有以下规则来工作,这组合:mod_rewrite的 - 麻烦的规则

  • 只上存在
  • 排除包含图像的任何文件,文件行事|在他们的URI
  • CSS | JS
  • 附加斜线来请求URI

重写规则:

RewriteEngine on 
DirectorySlash Off 

RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !/(images|js|css)$ 
RewriteRule ^(.*[^/.])$ /$1/ [R=301,L] 

我现在需要正确地重定向我家的URI的,像这样:

http://www.example.com/sitemap/ - >http://www.example.com/index.php?page=sitemap

我尝试以下方法:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/.])$ index.php?page=$1 [R=301,L,NC] 

但我得到一个页面没有找到,想必因为$ 1正在喂食一些有斜线的东西。我认为[^/]会删除它,但显​​然不是。

有人可以解释我哪里错了吗?

+0

为什么你需要**重定向**(URL将在浏览器中更改)?通常,人们希望保持“好”的URL,并在浏览器中URL保持不变时重写URL(内部重定向)。那是故意的还是错误的(我指的是你的第二条规则 - 'R = 301'部分)? – LazyOne

+0

这是一个错误,我对重定向位的工作原理有些朦胧。你说得对,我想保持漂亮的网址。 –

回答

1

使用此规则 - 这将改写/sitemap//index.php?page=sitemap

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/$ /index.php?page=$1 [QSA,L] 
  1. 把它放进的.htaccess到网站根目录。如果放置在其他地方,需要稍微调整一下。

  2. URL将保持不变。现有的查询字符串将被保留。

  3. 尾部斜杠/必须存在(即/sitemap不会触发此规则)。

  4. 只有在没有这样的文件夹或文件时才会重写(即如果您的网站根文件夹中有一个名为sitemap的文件夹,则不会发生重写)。

  5. 它只适用于1文件夹较深的URL(例如/sitemap/,/help//user-account/等)。它不适用于路径中的2个或更多文件夹(例如/account/history/)。


RE:这条线:RewriteCond %{REQUEST_URI} !/(images|js|css)$

你说你想要“排除任何包含图像的文件| js | css在他们的uri”。不幸的是,上述模式的工作方式不同 - 它将匹配/something/css,但不匹配/css/something/something/file.css

如果要在斜线后直接匹配URL中的图像| js | css任意位置,请删除$

+0

太棒了!现在完美运作,感谢解释和新规则。 301重定向index.php?page = sitemap到/ sitemap/now的最佳方式是什么? –

+1

@eb_Dev从SEO的角度来看,您有2个选择:1)使用实际的301重定向(这是首选选项)或2)使用规范网址(http://www.google.com/support/webmasters/bin/answer的.py?回答= 139394)。对于301重定向:'RewriteCond%{QUERY_STRING} = page = sitemap [NC]' 'RewriteRule^index \ .php $ http://%{HTTP_HOST}/sitemap /? [NC,R = 301,L]' – LazyOne

+0

另外我现在还有另一个问题,我相信这是我的第一条规则:RewriteRule ^(。* [^ /。])$/$ 1/[R = 301,L],如果我输入http://www.example.com/adadass/或任何不存在的文件,它会将其映射到主页并将其视为一个页面。我想RewriteCond%{REQUEST_FILENAME}!-f(或!-d)会阻止这个,但我一定是错的? –