2013-01-06 77 views
3

我使用Apache 2.2.22和PHP 5.3.10運行Ubuntu 12.04。我希望用戶能夠在我的網站上請求頁面,而不必鍵入'.php'擴展名,而不必擔心區分大小寫。例如,網址像這樣......Apache:如何重寫沒有文件擴展名的URL並忽略大小寫?

http://www.site.com/test/phpinfo 
http://www.site.com/test/PhPiNfO 

...應該都會導致:

http://www.site.com/test/phpinfo.php 

我開始不區分大小寫按照在this question接受的答案。下面是我的 '的/ etc/apache2的/網站可用/默認的' 文件看起來像......

<VirtualHost *:80> 
     ServerAdmin [email protected] 

     DocumentRoot /var/www 

     RewriteMap lc int:tolower 

     <Directory /> 
       Options FollowSymLinks 
       AllowOverride All 
     </Directory> 
     <Directory /var/www/> 
       Options Indexes FollowSymLinks MultiViews 
       AllowOverride All 
       Order allow,deny 
       allow from all 
     </Directory> 

     <Directory /var/www/test> 
       Options Indexes FollowSymLinks MultiViews 
       AllowOverride All 
       Order allow,deny 
       allow from all 
     </Directory> 

     ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 
     <Directory "/usr/lib/cgi-bin"> 
       AllowOverride None 
       Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch 
       Order allow,deny 
       Allow from all 
     </Directory> 

     ErrorLog ${APACHE_LOG_DIR}/error.log 

     # Possible values include: debug, info, notice, warn, error, crit, 
     # alert, emerg. 
     LogLevel warn 

     CustomLog ${APACHE_LOG_DIR}/access.log combined 

    Alias /doc/ "/usr/share/doc/" 
    <Directory "/usr/share/doc/"> 
     Options Indexes MultiViews FollowSymLinks 
     AllowOverride None 
     Order deny,allow 
     Deny from all 
     Allow from 127.0.0.0/255.0.0.0 ::1/128 
    </Directory> 
</VirtualHost> 

...這是我的.htaccess文件:

RewriteEngine On 
RewriteRule ^([a-z]+)/([a-z\-]+)$ /${lc:$1}/${lc:$2}.php [L,NC] 

文件的擴展部分是工作,但由於某些原因,大小寫敏感仍在執行。我的Apache錯誤日誌充滿了這樣的行:

[Sat Jan 05 23:10:41 2013] [error] [client 192.168.1.9] File does not exist: /var/www/test/phpinfO 

任何想法我在做什麼錯在這裏?

編輯:經過幾個小時的試驗後,我看到了最離奇的行爲!我想也許我的.htaccess文件只是被忽略,所以我填充它的胡言亂語。這如預期的那樣產生了內部服務器錯誤。然後我嘗試了這兩條線在我的.htaccess文件...

RewriteEngine On 
RewriteRule ^/(.*)$ /${lc:$1} 

...並試圖訪問不成功測試/ phpinfo.php的。然後我刪除了.htaccess文件,並將這兩行直接放到我的'/ etc/apache2/sites-available/default'文件中,然後重新啓動Apache。出於一些莫名其妙的原因,我想要的行爲現在正在工作!我不能可能如何,因爲我唯一的規則不會追加'.php'的URL!

這可能聽起來很奇怪,但它幾乎感覺我的更改正在以某種延遲方式生效。我嘗試了一些其他測試不能馬上工作,但是當它們不應該有時它似乎起作用。我繼續測試並期望我的當前設置在不改變任何內容的情況下打破。無論如何,我感到非常困惑。

希望有人能夠在我將大腦翻出來並用大錘砸碎之前將這些東西灑下來。

+0

在你最後的規則中,'$'應該是'/ $'中的文字字符還是元字符? –

+0

@FelipeAlamedaA:'/ $'中的'$'不是字面的。它允許我調用重新映射的內部函數。請參閱Apache文檔:[link](http://httpd.apache.org/docs/current/rewrite/rewritemap.html#int) –

+0

我知道。我只是確定。 –

回答

4

我終於這一個。那麼,至少有一部分。事實證明,'MultiViews'選項負責解析沒有'.php'擴展名的文件。也就是說,在與我「的/ etc/apache2的/網站可用/默認的」文件這兩條線相結合,給了我希望我的行爲:

RewriteEngine On 
RewriteRule ^/(.*)$ /${lc:$1} 

不幸的是,我一直沒能確定爲什麼我的.htaccess文件在具有上述規則時會被忽略,但在存在亂碼時不會被忽略。

編輯:好的,我想出了爲什麼.htaccess文件不起作用。它正在被閱讀,但第二條規則沒有被匹配。這裏的原因,根據Apache documentation

移除的前綴始終以斜線結束,這意味着匹配 發生對抗從未有斜線的字符串。因此,一個 模式與^ /從不匹配在每個目錄上下文中。

結果,我改變了我的.htaccess文件有這個...

RewriteEngine On 
RewriteRule ^(.*)$ ${lc:$1} 

...,它的最後工作!

0
CheckSpelling on 

匹配文件和目錄。詳情請參閱documentation

從複製= Case Insensitive URLs with mod_rewrite

+0

我在發佈之前確實嘗試過,但不起作用。 –

+0

@AlienBishop:請試試這個,這將工作...... –

+0

我也試過,以前我張貼,並導致Apache重定向到一個奇怪的頁面,這樣說: 多選題 您請求的文件名(/ test/phpinfO)在此服務器上找不到。但是,我們發現名稱與您請求的名稱相似的文檔。 可用文檔: /test/phpinfo.php(common basename) –