2009-01-31 109 views
9

我試圖在我的網站上創建乾淨的URL。現在我成功地配置了Apache,因此每個請求如mysite.com/page都可以工作。但我也希望mysite.com/page.php的請求將被重定向到mysite.com/page。我已經設置環境變量在.htaccess檢查,如果我已經被重定向到防止環路,但我還是讓他們... 這裏的的.htaccess:乾淨的URL重定向循環

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 

RewriteEngine On 
RewriteBase/

# set the variable 
RewriteRule ^$ - [L] 
RewriteRule ^(.*)$ $1 [E=REWROTE:0] 

# this works fine 
# make mysite.com/page work and set REWROTE variable to 1 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1] 

# but if i enable this, i get redirected and then stuck in a loop 
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1 
#RewriteCond %{ENV:REWROTE} !^1$ 
#RewriteRule ^(.*)\.php$ $1 [R=301,L] 

謝謝!

+0

歡迎堆棧溢出。感謝您清晰地描述您的問題,提供代碼,並顯示什麼可行,什麼不可行。如果您的apache日誌中有有用的信息,請將其發佈。有時,當您看到日誌時,重定向問題會變得更加明顯。 – 2009-01-31 16:20:34

+0

不幸的是,我無法訪問那種信息。 – oxeleo 2009-01-31 16:45:55

回答

14

添加此規則上面現有的重寫規則,以阻止重定向請求是否已經被重定向一次(ref):

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 
+0

賓果!像魅力一樣工作,不需要環境變量。 – oxeleo 2009-01-31 16:47:20

1

你可以檢查最初被要求什麼請求行:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ] 
RewriteRule \.php$ %1 [R=301,L] 

哦,RewriteCond directive的第一個參數不是一個正則表達式,而只是一個字符串。所以轉義.是錯誤的。

0

是否有某些原因導致您無法使用字符串結尾字符$?

RewriteRule ^/(.+)\.php$ /$1 

會將/page.php重定向到/頁面,但不會在/頁面上進行任何重定向。

基本上,使用諸如設置環境變量和爲REDIRECT_STATUS添加檢查等技術不會非常健壯。