2013-03-29 153 views
0

我寫了一個簡單的mod重寫腳本,將website.com/index.php?var1=1&var2=2&var3=3轉換爲website.com/index/1/2/3。出於某種原因,它不工作,爲什麼?Mod重寫無法正常工作

#RewriteRule ^$ index.php [QSA] 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.+)$ $1\.php [QSA] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php/$1 [QSA] 

RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ comments.php?var1=$1&var2=$2&var3=$3 

回答

0

它看起來像第6行的重寫將捕獲併發送到index.php。很難說不知道什麼是文件和目錄,但我猜測它不是。如果你有機會獲得你可以調高改寫記錄的httpd.conf中,設置

RewriteLogLevel 8 

而且比你需要調試這個它會記錄更多的信息。在Apache的較新版本的設置被設定爲LogLevel的e.g ..

LogLevel alert rewrite:trace8 

可以在虛擬主機或htaccess的允許所以看它在你的版本的文檔。

不要放棄這一點,因爲它會嚴重影響性能。

1
  • 第一條規則將index/1/2/3重寫爲index/1/2/3.php
  • 然後第二條規則將其重寫爲index.php/index/1/2/3.php
  • 最後最後一條規則不匹配。

如果你想重寫website.com/index.php?var1=1&var2=2&var3=3website.com/index/1/2/3,你必須捕捉查詢字符串參數與RewriteCond並將其插入到一個RewriteRule

RewriteEngine on 
RewriteCond %{QUERY_STRING} var1=(.*?)&var2=(.*?)&var3=(.*?) 
RewriteRule ^index.php$ /index/%1/%2/%3 [L] 

如果要重定向而不是內部重寫,即顯示在瀏覽器中新的URL,使用[R,L]作爲重寫規則標誌

RewriteRule ^index.php$ /index/%1/%2/%3 [R,L] 
+0

+1這實際上回答了「爲什麼不這樣做」的問題。 –

1

我不知道什麼是概率不LEM與你的問題的規則,但要實現這一點:

website.com/index.php?var1=1&var2=2&var3=3website.com/index/1/2/3

你需要在根目錄像這樣在一個.htaccess文件:

Options +FollowSymlinks -MultiViews 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_URI} !\.php [NC] 
RewriteCond %{REQUEST_URI} ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)/? [NC] 
RewriteRule .*     /%1.php?var1=%2&var2=%3&var3=%4 [L,NC] 

地圖默默:

http://website.com/filename/1/2/3

要:

http://website.com/filename.php?var1=1&var2=2&var3=3

凡文件名,,,和是動態的字符串。

對於永久重定向,請將[L,NC]替換爲[R = 301,L,NC]。