2014-02-11 53 views
0

我有htaccess文件執行URL重寫。它基本上刪除了.php擴展名。htaccess重寫,如何否定子目錄文件

規則可以正常工作,例如,他們成功地將http://example.com/contact.php改寫爲http://example.com/contact

但是,改寫也改變了子目錄文件,例如/includes/check-form-input.php

因此,例如,當contact.php上的表單試圖提交到/includes/check-form-input.php時,htaccess重寫會從最後剝離.php文件並獲得404頭文件。
即找不到/includes/check-form-input

至少,這似乎發生,使用HTTP_REFERER似乎證實了這一點作爲引用者是/includes/check-form-input沒有分機.PHP

有沒有一種方法添加規則來否定所有子迪爾斯?

我有以下htaccess的 - 這是從這裏SO另一個答案複製,因爲我沒有100%的把握重寫結構。
(我留在WWW到非www重定向的情況下,它的原因)

## Rewrite on 
RewriteEngine on 


## Redirect all pages from non-www to www 
Options +FollowSymLinks 
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC] 
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 


## URL rewrite 
# Unless directory, remove trailing slash 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/$ http://example.com/$1 [R=301,L] 

# Redirect external .php requests to extensionless url 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^(.+)\.php$ http://example.com/$1 [R=301,L] 

# Resolve .php file for extensionless php urls 
RewriteRule ^([^/.]+)$ $1.php [L] 

回答

1

您可以排除所有子目錄,

# Redirect external .php requests to extensionless url 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^([^/]+)\.php$ http://example.com/$1 [R=301,L] 

或限制爲只有GET請求:

# Redirect external .php requests to extensionless url 
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ (.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^(.+)\.php$ http://example.com/$1 [R=301,L] 

或只是排除includes子目錄

# Redirect external .php requests to extensionless url 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteCond %{REQUEST_URI} !^/includes/ 
RewriteRule ^([^/]+)\.php$ http://example.com/$1 [R=301,L]