0

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

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

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

提前感谢您的帮助!

4

3 回答 3

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;
于 2013-02-04T01:17:22.810 回答
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 参数与 url 分开。

于 2013-02-04T01:04:00.193 回答
0

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

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

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

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

或者,如果 URL 总是相同的(例如,总是 id=12&sid=2 类型的东西),您可以添加重写规则 - 例如:

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

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

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

于 2013-02-04T01:03:01.250 回答