2011-08-29 81 views
3

如果這是我的實際文件網址:正則表達式,以避免「髒」的網頁鏈接

http://www.example.org/posts.php?post=example-post-name

在我的.htaccess文件,我該如何使用正則表達式去這條道路,當用戶提交:

http://www.example.org/posts/example-post-name

到目前爲止,我想出了幾個例子,這個彙集(這也包括WWW重定向):

RewriteEngine On 

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

RewriteCond %{REQUEST_URI} !(\.[^./]+)$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule (.*) /$1.php [L] 
RewriteRule ^posts/([A-Za-z])/$ /posts.php?post=$1 

但我不會與它有多少運氣,任何人都可以告訴我在哪裏,我出錯了?

回答

3

你需要一個+後您的A-Za-z組來表示一個或多個字符,您還需要在該組的結尾添加一個-。最後,/?表示最後的斜線可能存在也可能不存在。

最後,添加[L]以確保沒有進一步的重寫規則得到處理。

RewriteEngine On 

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

# First rewrite the posts: 
RewriteRule ^posts/([A-Za-z-]+)/?$ /posts.php?post=$1 [L] 

# ing0 edit: add in dirs that need changing back. 
# (I dont know if there is an easier way to do this). 
RewriteRule ^posts/css/(.*)$ /css/$1 [L] 
RewriteRule ^posts/img/(.*)$ /img/$1 [L] 
# etc 

# Then, if it's not a real file and doesn't already end in .php 
# Note change here ... 
RewriteCond %{REQUEST_URI} !\.php$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# redirect it to PHP. 
RewriteRule (.*) /$1.php [L] 
+0

如果我添加此我得到一個'內部服務器Error'。 –

+0

!ing0請在您的服務器錯誤日誌中查看實際錯誤。 –

+0

只需查找此服務器上的日誌即可。如果我把正則表達式添加到文件末尾('RewriteRule(。*)/$1.php [L]')後面的正則表達式,我得到一個500服務器錯誤。如果我把它放在之前,網站加載,但它不起作用。 –

0

我認爲你需要匹配整個網址和正則表達式是不完全正確的。試試這個:

RewriteRule ^(.*)/posts/([\w-]+)$ $1/posts.php?post=$2 

如果它只能匹配URL的非基本部分,這本:

RewriteRule ^posts/([\w-]+)$ posts.php?post=$1 
0

爲什麼不使用:

RewriteRule ^posts/(.*)/$ posts.php?post=$1