Apache地址重写的几个问题
? ? ? Apache地址重寫的配置分為兩種方式,即通過httpd.conf配置和.htaccess文件。
????? 首先要打開rewrite模塊,windows下的配置是
LoadModule rewrite_module modules/mod_rewrite.so
?
????? httpd.conf的配置可以全局生效,也可以只配置一個目錄,需要做的事情是在相應目錄的Directory標簽下配置Rewrite規則。
????? .htaccess的則放到相應目錄下(或者根目錄)即可,這是VPS里常用的一種方式,畢竟作為一個VPS購買者不可能要求提供商去更改全局配置文件。這種方式需要注意的有如下兩點:
????? 首先,.htaccess要想起作用,必須要在httpd.conf中相應的Directory標簽下配置AllowOverride All(默認是None),其次是windows下這種無文件名僅有擴展名的文件是無法直接生成的,可以在cmd窗口下使用copy con命令來生成(這命令也有年頭了,我小學的時候還學過,光陰荏苒啊,扯遠了…),Ctrl+Z<Enter>保存。
???? 然后我們說一下幾個概念。
???? 首先是RewriteEngine,這是地址重寫的引擎,可以方便的設置為On或者Off來啟用和關閉引擎。
???? 其次是RewriteCond,地址重寫的條件,符合這個條件的才進行表達式判斷和重寫,這樣能有效減少匹配的條數,提高重寫效率。
???? 最后是RewriteBase和RewriteRule,RewriteBase指明重定向地址的基礎,即RewriteRule后一部分重定向地址會拼合上RewriteBase,合成一個完整的重定向地址。這在一個web容器下有多個網站的時候比較有用。
???? RewriteRule才是我們討論的主要話題。RewriteRule實現把符合表達式的地址重定向到另一個地址的功能,RewriteRule的語法類似于下面
RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2
????? RewriteRule緊跟著判斷表達式,之后是需要重定向的位置,正則表達式()會捕獲一個分組,然后通過$n引用這個分組,從而實現地址重寫。RewriteRule匹配的開始位置是整個URL去掉當前目錄后剩下的部分,比如我在/discuz配置上面所示的RewriteRule,然后輸入一個URL-http://localhost/discuz/forum-1-1.html,被用來匹配的輸入會是forum-1-1.html,也就是前面的/discuz/被吃掉了。對于整個問題,我們可以用如下的語句驗證。
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ rewrite.php?param=$1
注:在rewrite.php里打印一下GET['param’]參數
???? 另外這里需要說明的是,如果我定義了
RewriteBase /discuz
???? 那么前面的^forum-([0-9]+)-([0-9]+)\.html$不受影響,但是后面會變成/discuz/forumdisplay.php?fid=$1&page=$2。不過RewriteBase并不是必須的,若有指定RewriteBase,結果為RewriteBase+重定向地址,否則為當前目錄+重定向地址。這里當前目錄指的是.htaccess所在目錄(使用.htaccess的時候)或者Directory標簽指定的目錄(使用httpd.conf的時候)。
???? 以上操作在windows下測試通過。
參考文獻:
[1]Apache中RewriteCond規則參數介紹,
http://hi.baidu.com/%D2%BB%CE%C4%CC%EC/blog/item/ace7f14e19851cc4d0c86af2.html
[2]RewriteRule-htaccess詳細語法使用教程,
http://www.3code.cn/rewriterule-htaccess%E8%AF%A6%E7%BB%86%E8%AF%AD%E6%B3%95%E4%BD%BF%E7
轉載于:https://www.cnblogs.com/sdqxcxh/archive/2012/04/02/2430239.html
總結
以上是生活随笔為你收集整理的Apache地址重写的几个问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源MongoDB管理工具MongoCo
- 下一篇: a href=#与 a href=jav