页面上的ModRewrite网址可删除扩展名

时间:2013-02-04 00:49:45

标签: php apache .htaccess

是否可以更改页面上的所有链接以删除扩展名。

Example:
www.domain.com/index.php
changes to
www.domain.com/index

我希望页面上的实际链接发生变化,以便当用户将鼠标悬停在链接上时,它没有php扩展名,而不是每次都进行重定向。我不确定它是否可行,但我更愿意这样做,而不是必须更改我的所有代码以删除php扩展。

我也可以重写每个链接,例如:

www.domain.com/index?id=12&sid=2
to
www.domain.com/index/id/12/sid/2

或者我必须为我想要为其执行的每个页面手动执行此操作。

先谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

不确定。我想我会通过使用输出缓冲来做到这一点。所以我把ob_start();在页面顶部(在任何输出之前),然后在底部$ contents = ob_get_contents();

然后你需要一组正则表达式来进行更改。这里的详细信息取决于您构建网站的方式,例如是否有完整的URL或相关链接;如果你对使用属性等的双引号或单引号保持一致,那就像:

$urls = preg_match_all( '|href="http://www.domain.com/[^"]+\.php?[^"]+"|', $contents, $m );
foreach( $m as $u ) {
  $n = preg_replace( "/\?|=|&/", '/', $u );
  $contents = str_replace( $u, $n, $contents );
}
$contents = preg_replace( '|(href="http://www.domain.com/[^"]+)\.php|', $1, $contents );
echo $contents;

答案 1 :(得分:0)

删除.php很简单,添加重写可能很棘手。

wordpress(以及许多其他脚本)的方式是通过重定向PHP脚本的所有内容:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

您可以阅读代码并向后设计类似的解决方案。

或者,如果网址始终相同(例如,始终为id = 12& sid = 2类型的东西),则可以添加重写规则 - 例如:

RewriteRule ^/index\.php\/?id\=([0-9]+)&sid=([0-9]+)$ /index/id/{$1}/sid/{$2}

这只是伪语法可能需要检查。

另外,您使用的是预先打包的软件包吗?如果是这样,它可能已经有了选项。请告诉我们。

答案 2 :(得分:0)

首先,您应该在根目录中添加一个.htaccess文件,其中包含以下内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /router.php

这将做什么:将每个请求重定向到router.php文件中不存在的文件。我这样做,在我的router.php文件中,我检查了什么是url(www.domain.com/index)然后包含好文件。示例:

$requestURI = explode('/', trim($_SERVER['REQUEST_URI']));
if (isset ($requestURI[1]) && (resquestURI[1] === "index"){
    require "index.php";
}
else {
    //file not found
}

对于“?”。我认为你不能删除它,它用于将你的GET参数与网址分开。