我在共享的Apache Web服务器上运行PHP。 我可以编辑.htaccess文件。
我试图模拟一个实际上不存在的文件文件结构。 例如,我想要的URL: www.Stackoverflow.com/jimwiggly
实际显示www.StackOverflow.com/index.php?name=jimwiggly
我得到了一半通过编辑我的.htaccess文件按照这篇文章中的说明: PHP:在文件结构中提供没有.php文件的页面 :
RewriteEngine on RewriteRule ^jimwiggly$ index.php?name=jimwiggly
这很好地工作,因为URL栏仍然显示www.Stackoverflow.com/jimwiggly
和正确的页面加载,但是,我所有的相对链接保持不变。 我可以在每个链接之前插入<?php echo $_GET['name'];?>
,但似乎可能有更好的方法。 此外,我怀疑我的整个方法可能会closures,我应该以不同的方式进行?
我认为最好的办法是采用MVC风格的URL操作,而不是使用参数。
在你的htaccess使用像:
<Ifmodulee mod_rewrite.c> RewriteEngine On #Rewrite the URI if there is no file or folder RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] </Ifmodulee>
然后在你的PHP脚本中,你需要开发一个小的类来读取URI,并将它分成诸如
class URI { var $uri; var $segments = array(); function __construct() { $this->uri = $_SERVER['REQUEST_URI']; $this->segments = explode('/',$this->uri); } function getSegment($id,$default = false) { $id = (int)($id - 1); //if you type 1 then it needs to be 0 as arrays are zerobased return isset($this->segments[$id]) ? $this->segments[$id] : $default; } }
使用像
http://mysite.com/posts/22/robert-pitt-shows-mvc-style-uri-access
$Uri = new URI(); echo $Uri->getSegment(1); //Would return 'posts' echo $Uri->getSegment(2); //Would return '22'; echo $Uri->getSegment(3); //Would return 'robert-pitt-shows-mvc-style-uri-access' echo $Uri->getSegment(4); //Would return a boolean of false echo $Uri->getSegment(5,'fallback if not set'); //Would return 'fallback if not set'
现在在MVC通常喜欢http://site.com/controller/method/param,但在一个非MVC风格的应用程序,你可以做http://site.com/action/sub-action/param
希望这有助于您继续使用您的应用程序。