2013-10-02 19 views
0

我在我的htaccess文件下面的代碼:虛榮URL和文件擴展名的腳本干擾在一起

Options +FollowSymLinks -MultiViews 
RewriteEngine On 
RewriteBase/

#vanity URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA] 
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*) 
RewriteRule^/%1?%2 [L,R=301] 

#remove file extensions 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 


ErrorDocument 400 /404.php 
ErrorDocument 401 /404.php 
ErrorDocument 403 /404.php 
ErrorDocument 404 /404.php 
ErrorDocument 500 /404.php 

<Files .htaccess> 
order allow,deny 
deny from all 
</Files> 

關於個性化網址,它工作正常,但是當涉及到去除在該PHP擴展 URL的結束,它不工作

如果我進入mysite.com/home.php,我得到重定向到home.php但延長依然存在,在地址欄中。

2.如果我進入mysite.com/home,我重定向到我的自定義錯誤頁,因爲home不是一個用戶名是我的數據庫。

我該如何修復1.和2.?

回答

1

您需要在之前執行php擴展檢查的用戶名路由。當然,如果你碰巧有一個與用戶名相同的php文件,這當然會破壞,除非你用所有用戶名作爲前綴,否則沒有辦法解決這個問題。

所以各地的交換你的規則,並添加另一個規則重定向直接訪問到PHP文件:

# we don't want to mess with /profile.php access because there's a rule later that deals with that 
RewriteCond %{REQUEST_URI} !^/profile\.php 
RewriteCond %{THE_REQUEST} \ /(.*)\.php(\?|\ |$) 
RewriteRule^/%1 [L,R=301] 

# add file extensions back to URI 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

#vanity URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA] 
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*) 
RewriteRule^/%1?%2 [L,R=301] 

我的意思是由前綴爲用戶什麼是這樣的:

http://mysite.com/u/foobar 

這裏, /u/表示「foobar」是一個用戶,而不是一個php頁面。要做到這一點,你需要一些修改添加到「#個性化網址」部分:

#vanity URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^u/([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA] 
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*) 
RewriteRule^/u/%1?%2 [L,R=301] 

主要包括/u/作爲比賽的一部分,並重定向。

+0

+1這個很好的解釋!我要阻止用戶名,如關於,設置等...所以我不需要前綴。您的代碼似乎適用於網頁,但它不適用於我的表單操作文件:我的表單不再提交。如果home.php有一個窗體的動作文件「signup.php」,我會重定向到mysite.com/signup,然後什麼也不做。任何想法爲什麼? –

+0

也許僅僅刪除某些指定URL的文件擴展名比較容易,例如:home.php和account.php。這可能通過htaccess嗎? –

+1

@ChHr在第一條規則中,'(。*)'需要爲'(home | account)',第二個規則'([^ \。] +)'需要爲'(home | account) '。 –