2012-08-05 21 views
2

我正在嘗試爲開發測試設置一個動態的應用程序服務框架。Apache或PHP重定向到奇怪的URL

我想要的結果是,當用戶進入到一個URL,如果它的格式如下hostname.com/somecategory/someapplicationname/hostname.com/somecategory/someapplicationname(結尾沒有斜槓),它應該服務於用戶的請求的應用程序從數據庫,只要類別和應用程序名稱作爲關鍵字存在。

我有一個特殊情況,其中一些應用程序不在數據庫中,並且它們存在於具有相同URL的文件中,所以我們優先於任何數據庫記錄提供現有文件。

來自數據庫的動態內容的情況正常工作。只有在最後有斜線時,現有文件的情況才能工作100%。如果斜槓不在那裏,它會提供正確的文件,但是URL看起來很奇怪。它會顯示:hostname.com/somecategory/someapplicationname/?category=somecategory&appname=someapplicationname
所以,它的工作原理,但意想不到的輸出使我覺得解決方案不完整。

我使用Apache mod_rewrite的,我的.htaccess文件如下:

RewriteEngine on 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ route.php?category=$1&appname=$2 [NC,L] 

具體到本案的PHP代碼如下。爲了簡化閱讀,我從這段代碼剝離了驗證和數據庫連接,但保留了這種特殊情況的邏輯。

$file = $_SERVER['DOCUMENT_ROOT'] . $_GET['category'] . "/" . $_GET['appname'] . "/index.php"; 
$fileNoPHP = $_SERVER['DOCUMENT_ROOT'] . $_GET['category'] . "/" . $_GET['appname'] . "/index.html"; 
$_fileExists = file_exists($file); 
$_fileNoPHPExists = file_exists($fileNoPHP); 
include_once($_fileExists ? $file : $fileNoPHP); 

需要明確的是,我的問題是:爲什麼我的現有文件的情況下追加GET URL參數的結束,只有當在最後的斜線,不是嗎?

謝謝你的時間。如果您需要更多信息,請告訴我,我會提供。

+0

是否使用'RewriteRule ^([A-Za-z0-9 - ] +)/([A-Za-z0-9 - ] +)(/)?$ route.php?...'工作? – 2012-08-05 05:29:50

+0

謝謝你的迴應。我仍然使用RewriteRule獲得相同的效果。 – invalidsyntax 2012-08-05 05:32:52

+0

我不擅長正則表達式,但我試圖做的是使斜線可選。所以,我想,試驗和錯誤。這是否:'RewriteRule ^([A-Za-z0-9 - ] +)/([A-Za-z0-9 - ] +)(/ |)?$ route.php?...'或者: 'RewriteRule ^([A-Za-z0-9 - ] +)/([A-Za-z0-9 - ] +)(/?)?$ route.php?...'工作? – 2012-08-05 05:36:26

回答

3

,你有這個規則是不是有什麼原因造成的奇尋找網址:

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ route.php?category=$1&appname=$2 [NC,L] 

這應該是罰款。在某處,您要麼生成該鏈接,要麼將瀏覽器重定向到該鏈接。如果你有一個規則,看起來是這樣的:

RewriteRule route.php /%1/%2/ [R=301,L] 

您需要通過添加一個?末去除查詢字符串:

RewriteRule route.php /%1/%2/? [R=301,L] 

或者,如果你使用Apache 2.4,包括括號中的QSD標誌。

如果這樣不能解決問題,則需要添加一條規則以確保附加斜線,儘管這可能與DirectorySlash重定向(您可以關閉)有關。

+0

我遵循了你的建議,並添加了一條規則以確保添加了斜線。這爲我解決了它。此外,爲了科學好奇心,我嘗試使用DirectorySlash方法,這也起到了作用,但對網站的其他部分造成了一些奇怪的副作用。感謝您的幫助。 – invalidsyntax 2012-08-05 06:05:46

+0

@invalidsyntax是的,關閉'DirectorySlash'可能會影響其他事情,默認情況下它始終打開,它用於確保請求(看起來是)目錄始終有一個尾部的斜槓 – 2012-08-05 06:07:40

+0

因此,它不是正則表達式是問題:-) – 2012-08-06 20:25:50