2011-07-13 75 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)會阻止這個,但我一定是錯的? –