我使用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!
這可能聽起來很奇怪,但它幾乎感覺我的更改正在以某種延遲方式生效。我嘗試了一些其他測試不能馬上工作,但是當它們不應該有時它似乎起作用。我繼續測試並期望我的當前設置在不改變任何內容的情況下打破。無論如何,我感到非常困惑。
希望有人能夠在我將大腦翻出來並用大錘砸碎之前將這些東西灑下來。
在你最後的規則中,'$'應該是'/ $'中的文字字符還是元字符? –
@FelipeAlamedaA:'/ $'中的'$'不是字面的。它允許我調用重新映射的內部函數。請參閱Apache文檔:[link](http://httpd.apache.org/docs/current/rewrite/rewritemap.html#int) –
我知道。我只是確定。 –