2010-04-22 78 views
5

我只安裝具有以下的RewriteCond一個子域:如何讓apache RewriteRule正確地爲子域工作?

RewriteCond $1 !^search.php$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 

我用我的主域相同改寫條件和它完美的作品。但是,當我在子域上設置它時,它只是在輸出「index.php」時輸出http://sub.domain.com

子域的每個頁面都輸出正文中的頁面名稱,而不是處理代碼,除了搜索頁面,似乎工作正常。

如何解決此問題?

+0

你有沒有爲通配符域做任何特殊的事情? (除了httpd.conf中的「ServerAlias * .example.com」)。 – Kdeveloper 2010-04-30 19:25:45

回答

0

這裏想到幾件事:

我有一些建議/意見/陷阱。希望其中之一對您有用:

  1. 確保search.php不只是迴應其$_GET參數。雖然這在回顧過程中聽起來很明顯,但它是更容易被忽視的解決方案之一。
  2. RewriteRule當您在服務器配置文件中指定它時,與在.htaccess中指定它時略有不同。特別是,在使用整個URL時,^/在服務器配置版本中是錯誤的(http://sub.domain.com/blah)。
  3. 請確保沒有其他重寫規則正在爲此子域首先處理,無論是在主httpd.conf/apache2.conf還是.htaccess中。
  4. 確保RewriteEngine On出現在您的配置中,因爲它是按每個VirtualHost激活的。
  5. NS標誌將忽略使用相對的Redirect或相對的RewriteRule完成的重定向。
+0

'^ /'完美的作品,整個域是**不**使用。只有路徑。 – 2010-04-29 03:06:21

+0

另外,如果在.htaccess文件中激活RewriteEngine,請確保AllowOverride設置爲適當的值。 – 2010-07-01 23:11:31

0

聽起來像模式'^ /?([^ /] +)$'可能根本不匹配。

我會激活RewriteLog,將RewriteLogLevel啓動到3級或更高級別,並查看您的模式是否完全匹配。如果不是,從一個更簡單的模式開始,然後按照更復雜的模式工作。

或者,其他的東西是匹配的模式,所以請求永遠不會'RewriteRule^/?([^ /] +)$'。你會在RewriteLog中看到這個。

我相信我最近有一個問題,在某些情況下,虛擬主機上'^ /'不匹配。但'/'工作。 Freenode.org #httpd中的人幫助了我。如果我可以在筆記中找到它,我會在這裏發佈。

1

我還沒有玩過你的確切正則表達式與mod_rewrite,但如果我正在看寫在另一個引擎中的正則表達式,我將不得不逃脫斜線。此外,鑑於$用於指示後向引用,是否也需要轉義(在正則表達式中您的$符號是否必要,因爲URI中可能有更多的文本,並且它不匹配字符串的末尾)?

我會嘗試其他

RewriteCond $1 !^search.php$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^\/]+)$ search.php?q=$1 [L,NS] 

一兩件事。正則表達式$在正則表達式的結尾意味着「只有匹配,如果這是字符串的結尾」。因此,如果RewriteCond匹配^搜索。php $,但URL是search.php?q = ...然後我會認爲這不匹配,因爲search.php不是字符串的結尾。所以這看起來像下面(假設你不需要需要改變你原來的其他東西)。

RewriteCond $1 !^search.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 
1

在主配置的路徑總是開始/而你需要的絕對路徑:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !^search.php$                                            
RewriteCond %{REQUEST_FILENAME} !-f                                              
RewriteRule ^/([^/]+)$ %{DOCUMENT_ROOT}/search.php?q=$1 [L] 

在一個.htaccess你需要的是URL中剝離(沒有一個RewriteBase /在規則),路徑是相對的。

RewriteEngine On 
RewriteBase/                                                   
RewriteCond %{REQUEST_FILENAME} !^search.php$                                            
RewriteCond %{REQUEST_FILENAME} !-f                                              
RewriteRule ^([^/]+)$ search.php?q=$1 [L]