2015-04-02 89 views
0

在一週之內的好一段時間裏,我的頭撞到這個問題後,事實證明是同樣的問題和解決方案,因爲在這個線程中:RewriteCond in .htaccess with negated regex condition doesn't work?Apache RewriteCond:如何只匹配最高級別的請求(無子目錄)

TL; DR:我在某個時候刪除了我的404文檔。這導致Apache在試圖爲新頁面提供服務時再次運行規則,而不能。在第二次旅行中,它總能符合我的特殊條件。


我有無盡的煩惱與此正則表達式,我不知道是否是因爲我失去了一些東西有關的RewriteCond還是什麼。

簡單地說,我只想匹配頂級請求,意味着任何沒有子目錄的請求。例如,我想匹配site.com/index.html,但不匹配site.com/subdirectory/index.html

我想我應該能夠與此完成它:

RewriteCond %{REQUEST_URI} !/[^/]+/.* 

有趣的是,這是行不通的但反過來做。例如:

RewriteCond %{REQUEST_URI} /[^/]+/.* 

當有一個子目錄將檢測。它會省略頂級請求(site.com/toplevelurl)。但是當我把感嘆號放在前面來反轉規則(RewriteCond應該允許)時,它會停止匹配任何內容。

我已經嘗試了許多不同的正則表達式和不同的模式,應該工作,但似乎沒有。任何幫助,將不勝感激。 this Stack Overflow答案似乎應該回答它,但不適合我。

我也用這個.htaccess rule tester對它進行了測試,我的模式在測試儀中工作,它們只是在實際的服務器上不起作用。


編輯:請求,這裏是我的.htaccess。它允許沒有文件擴展名的URL,也可以做類似於自定義404頁面的URL(儘管它的目的是允許文件名作爲參數,而不是404替換)。

Options +FollowSymLinks 

DirectoryIndex index.php index.html index.htm 

<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 
RewriteCond %{REQUEST_FILENAME} =/home/me/public_html/site/ 
RewriteRule ^(.*)$ index.php 
RewriteCond %{REQUEST_FILENAME} !-f # Below this is where I would like the new rule 
RewriteRule ^(.*)$ newurl.php 
</IfModule> 
+0

看起來像您可以跳過行開始和結束錨點。爲什麼? – arkascha 2015-04-02 19:26:53

+0

這只是我試過的最新的正則表達式;我也嘗試過開始和結束的主播,是的。其實最終版本應該使用它們,所以我會。 – felwithe 2015-04-03 00:46:04

回答

0

我想匹配site.com/index.html,但不site.com/subdirectory/index.html

您可以使用:

RewriteRule ^[^/]+/?$ 

或者使用RewriteCond

RewriteCond %{REQUEST_URI} ^/[^/]+/?$ 
+0

'RewriteCond%{REQUEST_URI} ^/[^ /] + /?$'不起作用,對不起。我使用的是RewriteCond,因爲我在RewriteRule中做了其他的事情。 – felwithe 2015-04-03 00:49:53

+0

哪個網址無效?你能否提出有問題的完整htaccess? – anubhava 2015-04-03 03:36:04

+0

這些網址是可變的;它沒有檢測到帶有斜槓的URL,這正是我需要的。我將發佈.htaccess。 – felwithe 2015-04-03 12:46:34