2012-12-07 62 views
1

好吧,Apache的現代重寫與URL時期

所以我使用(或嘗試使用)兩個主要mod_rewrite的規則,他們似乎彼此

RewriteRule ^/?help$ index.php?page=help [L] 

發生衝突
RewriteRule ^/?([a-zA-Z0-9._-]+)$ index.php?user=$1 [L] 

如果我擺脫了期間 - >。在第二條規則中,顯示我的幫助頁面,我也可以顯示一個用戶頁面,但是當我添加句點時,我的幫助頁面不顯示,而是(我認爲)作爲用戶頁面進行處理。

任何人有任何指針?

回答

0

我看了一些其他用戶碰到了在這裏 - Apache/mod_rewrite/Periods messing with pattern,並修改自己的規則,它是工作 -

RewriteRule ^/?help$ index.php?page=help [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/?([a-zA-Z0-9\[\]\.()+|_-]+)$ index.php?user=$1 [L] 

三江源響應。

0

首先,如果你在.htaccess中這樣做,mod_rewrite不會停止處理,而是執行內部重定向。詳細信息請參見this answer

您需要在第二條重寫規則中跳過句點。週期(或點)將匹配任何字符,如果不逃脫。

固定的規則:

RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L] 

編輯3:

根據您的意見和自己的答案,這裏是一個更新的解決方案。在Apache中工作的方式RewriteCond %{REQUEST_FILENAME}取決於您所在的上下文。您還可以從匹配模式中忽略?

RewriteRule ^/help$ /index.php?page=help [L] 
# If you are inside <VirtualHost> context 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d 
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L] 
# If you are inside <Directory> or .htaccesscontext 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L] 

千萬牢記,該方案將導致衝突,如果有用戶使用相同的名稱作爲任何你有你的服務器上的文件或目錄。

+0

我正在嘗試使頁面=幫助直接到/幫助和?user = user.name直接到/user.name(我本來應該發佈,最初...對不起)。即使是逃避期限也不能正確指導幫助頁面。它正在被閱讀爲用戶頁面。當我回顯幫助頁面的$ _GET ['user']變量時,它會顯示「index.php」。我也嘗試了重寫條件,但它給了我一個404. –

+0

感謝您的答覆順便說一句。 –

+0

爲了澄清,我的網站網址是www.site.com/help,php會在內部處理index.php?page = help。它有效,但是當我嘗試添加「用戶」規則時,除非我排除期限,否則它不會。 –