2015-03-13 105 views
0

我有一個基於php的系統(稱爲OJS)安裝在我的主機上。它使用SMARTY創建頁面。我有一個網址,如網頁: http://example.com/ojs/index.php/foo如何做.htaccess URL重寫以包含URL中的index.php?

我希望能夠在地址欄中鍵入http://example.com/ojs/foo和的.htaccess將添加的index.php到URL,並執行新的完整URL,這樣指數.php可以生成所需的頁面。

現在我在ojs文件夾的.htaccess文件中使用以下內容。

<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php/$1 [QSA,L] 
    </IfModule> 

我也嘗試過很多其他的.htaccess語法和指令。但其中沒有一個可行。 當我在地址欄中輸入http://example.com/ojs/index.php/foo時,我得到了我想要的頁面。 當我進入http://example.com/ojs/foo(或OJS如http://example.com/ojs/blahblahttp://example.com/ojs/index.php/blahblahbla沒有定義任何頁)它顯示的主網頁http://example.com/ojs/

我做了一個測試,我想重寫規則,至少在做一些事情。我在文件index2.php(在ojs文件夾中)中創建了一個虛擬的php代碼,它反映了超全局值。對於這個測試我修改重寫規則,包括index2.php,我也得到如下結果:

$_SERVER['HTTP_HOST']: example.com 
$_SERVER['REQUEST_URI']: /ojs/anything 
$_SERVER[SCRIPT_NAME]: /ojs/index2.php 
$_SERVER['PHP_SELF']: /ojs/index2.php 
$_SERVER['REQUEST_METHOD']: GET 
$_SERVER['PATH_INFO']: 
$_SERVER['ORIG_PATH_INFO']: /anything 
__FILE__: /home/user/public_html/ojs/index2.php 

誰能想到,爲什麼我的噸與index2.php工作,它不適用於index.php?

我的配置是否有幫助:

PHP版本29年3月5日, Apache的版本2.2.29, 主持人:交友,共享Linux主機,
我沒有進入主錯誤日誌或Apache配置文件。

非常感謝你,

回答

0

我認爲這是類似於笨,我們從URL的index.php刪除。 您可以使用下面的.htaccess代碼從url中刪除index.php。您必須將下面的代碼放到項目的根文件夾中。

RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond $1 !^(index\.php) 
RewriteRule ^(.*)$ index.php/$1 [L] 
+0

謝謝。我試過了。但仍然無效。 – cybergeek654 2015-03-13 18:19:46

+0

嘿,你需要給.htaccess文件的讀取權限。 – 2015-03-14 18:34:32

+0

它有644許可。 – cybergeek654 2015-03-15 11:22:29

0

坦白說,我懷疑OJS系統讀取REQUEST_URI,並期待它是這樣的形式/ojs/index.php/foo的。它取而代之/ojs/foo,由於它不承認,顯示主頁面。

我想你需要告訴(或修改)OJS期望/ojs/foo形式。

爲了仔細檢查Apache是​​否搞亂了,請添加一個R=301標誌進行測試。如果我是對的,你應該得到一個重定向到/ojs/index.php/foo - 當瀏覽器遵循重定向時,它會起作用。當然,這是不理想的,所以修復OJS的期望值應該遵循。 :)

QSA是不必要在這裏,順便說一句。)答覆

+0

謝謝@The Sidhekin,我會測試它。只是一個問題:是不是URL重寫與.htaccess整點,當地址http://example.com/ojs/foo請求從服務器,Apache服務器首先將其轉換爲http://example.com/ojs/index.php/foo然後進行處理,如果Apache正確執行,那麼OJS不應得到/ ojs/foo,但它應該得到/ojs/index.php/foo。我錯過了什麼嗎? – cybergeek654 2015-03-13 19:52:52

+0

@ cybergeek654'REQUEST_URI'包含原始(預重寫)請求的URI的路徑組件;重寫只剩下那個。在這種情況下,index.php也會改變你的情況下的PATH_INFO,它可能會改變其他的東西(我不知道OJS,但我懷疑它使用'REQUEST_URI',我會如果它完全忽略了'PATH_INFO',在這種情況下只是重定向到index.php(沒有/ $ 1 'PATH_INFO')可以工作。) – 2015-03-13 20:09:52

+0

我現在看到。有沒有辦法可以避免修改OJS代碼,並得到這個工作? – cybergeek654 2015-03-14 11:34:36