2017-09-27 44 views
2

我想弄清楚如何重寫使用Apache Web服務器和PHP的URL。在Apache中使用獲取參數的自定義URL

下面的網址是真正的nonrewritten網址:

http://localhost:1337/rewritetest/index.php?id=12 

而且我想通過

http://localhost:1337/rewritetest/index/12 

我INDEXFILE達到它看起來像這樣:

<?php 
    echo $_GET['id']; 
?> 

這是可能的? 「新」網址不包含任何參數名稱,所以我想我必須使用參數順序,但我不知道如何達到他們在這種情況下。

下面是據我已經跟我的改寫:

RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_+]+) 
RewriteRule ^/?index.php$ %1? [R=301,L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?id=$1 [L] 

任何人有什麼我做錯了的想法?

+0

你的'.htaccess'文件位於哪裏? – MrWhite

+0

對不起,它位於與index.php相同的文件夾中。並且它是服務器上唯一的htaccess,並且在服務器端沒有配置任何東西 – DavidLar

+0

它總是應該重寫爲index.php(如代碼所示),還是應該重定向到URL中指定的任何基本名稱(因爲您的URL建議)?例如。 '..../foo/26'到'..../foo.php?id = 26'? – MrWhite

回答

0

它位於同一文件夾中的index.php

因此,考慮到.htaccess文件位於/rewritetest/.htaccess(相對於文檔根即/.htaccess)然後...

RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?id=$1 [L] 

如果您請求的形式/rewritetest/index/12的URL,然後上面的RewriteRule模式實際上不會匹配任何東西。它試圖匹配「索引/ 12」,但你的模式不包含斜線,所以會失敗。 (是字符類中的+故意的嗎?)

試着這麼做,而不是執行以下操作:在URL

RewriteRule ^(index)/(\d+)$ $1.php?id=$2 [L] 

這顯然符合具體「指標」。如果你總是改寫爲index.php,那麼你不需要在URL中「索引」 - 除非這意味着不同的東西?這也假設id參數的值僅包含數字。

要重寫更一般的.../<controller>/26.../<controller>.php?id=26(如前所述評論),那麼你可以試試:

RewriteRule ^([\w-]+)/(\d+)$ $1.php?id=$2 [L] 

在每個目錄.htaccess文件斜線前綴省略由匹配的URL路徑上RewriteRule模式,所以不需要/?。以上模式也匹配東西id,而不是任何東西。所以,/index/不匹配。


如果這是一個新的網站,然後在「重定向」(從/index.php?id=12/index/12)不一定需要。如果您要更改現有網站上的舊網址已具有入站鏈接並被搜索引擎編入索引的網址,那麼這才真正需要。在這種情況下你可以不喜歡以下前的內部重寫:

RewriteBase /rewritetest/ 

RewriteRule %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{QUERY_STRING} ^id=(\d+) 
RewriteRule ^(index)\.php$ $1/%1 [R,L] 

或者,(如上所述)更通用.../<controller>/26.../<controller>.php?id=26然後更改RewriteRule到:

RewriteRule ^([\w-]+)\.php$ $1/%1 [R,L] 

針對REDIRECT_STATUS環境變量的附加檢查是爲了在之前將URL重寫爲/index.php?id=12之後防止重寫循環。

相關問題