2011-07-15 34 views
0

我一直在試圖使友好的網址爲我的網站,並具有以下規則:mod_rewrite的 - 如何讓兩個規則一起工作

#enable rewrites 
RewriteEngine on 
RewriteBase/

# Redirect 404s 
ErrorDocument 404 /404_not_found.cfm 

# Redirect non www to www 

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

# Add trailing slashes to uri 

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

# Redirect any request with page var to /var/ format 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{QUERY_STRING} ^page=(.+[^/])$ [NC] 
RewriteRule ^index\.cfm$ http://%{HTTP_HOST}/%1/ [R=301,L,NC] 

# If not an existing file or directory 
# Rewrite any request var/ to index.cfm?page=var 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])/$ /index.cfm?page=$1 [QSA,L] 

# property services 

# Add trailing slash if not a file or directory and 301 redirect 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^property-services/([^/.]+)$ http://%{HTTP_HOST}/property-services/$1/ [R=301,L,NC] 

# Rewrite request any request with page var to property-services/var/ 
RewriteRule ^property-services/([^/.]+)/$ property-services/index.cfm?page=$1 [L,NC] 

一切正常接受最後的規則:

# Rewrite request any request with page var to property-services/var/ 
RewriteRule ^property-services/([^/.]+)/$ property-services/index.cfm?page=$1 [L,NC] 

頁時,我嘗試的請求沒有被加載:

http://www.example.co.uk/property-services/example-service/ 

如果刪除了倒數第二個,然後排除我可以通過請求加載頁面:

http://www.example.co.uk/property-services/example-service 

問題是我需要用斜線加載頁面,因爲這是我爲網站選擇的格式。有人能解釋我錯在哪裏嗎?

+0

只是爲了簡單:你可以打包最RewriteCond'的'在一起:'的RewriteCond%{} REQUEST_FILENAME -f 的RewriteCond%{ REQUEST_FILENAME} -d RewriteRule。* - [l]' – KingCrunch

+0

感謝您的建議KingCrunch,是一個全球性的規則,所以我不必繼續使用RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d爲每個規則? –

+1

它對你現在正在做的事情的否定:你說「如果X不是文件而不是目錄做Y」(4次)。我說「如果x是文件或目錄,什麼也不做」,所以你應該只需要它一次。 'RewriteCond%{REQUEST_FILENAME} -f [OR] RewriteCond%{REQUEST_FILENAME} -d RewriteRule。* - [L]'(我忘了'[OR]'-flag;))。它應該使其更具可讀性,但我不完全確定,它不會干擾其他規則/ cond。 – KingCrunch

回答

1

該規則將匹配任何以單斜槓結尾的URL(但不是雙斜槓),因此它將阻止您到達最後一條規則。

RewriteRule ^(.+[^/])/$ /index.cfm?page=$1 [QSA,L] 

我懷疑你需要沿着線的東西:

RewriteRule ^([^/]+)/$ /index.cfm?page=$1 [QSA,L] 
+0

感謝mootinator,這幫助我找到了我之後的解決方案。 –