3

我正在尝试清理我博客上的一些 URL,所以我决定研究 mod_rewrite。我不知道我在做什么,所以我希望能得到一些帮助:PI 有链接,如http://kn3rdmeister.com/blog/post.php?y=2012&m=07&d=04&id=4. 尽管它有效,而且人们仍然可以获得我希望他们拥有的内容,但我不喜欢他们必须查看所有查询字符串。我想把上面的链接变成http://kn3rdmeister.com/blog/2012/07/04/4.php.

这就是我的 .htaccess 现在的样子。

RewriteEngine On
RewriteCond %{QUERY_STRING} ^y=([0-9){4})&m=([0-9]{2})&d=([0-9]{2})&id=([0-9]*)$
RewriteRule ^/blog/post\.php$ http://kn3rdmeister.com/blog/%1/%2/%3/%4.php? [L]

就像我说的,我完全一无所知:D

4

2 回答 2

3

如果您使用的是 apache 2.0 或更高版本,如果这些规则位于 .htaccess 文件中,您将需要删除前导斜杠(前缀),以便您的正则表达式如下所示:

# also note this needs to be a "]"--v
RewriteCond %{QUERY_STRING} ^y=([0-9]{4})&m=([0-9]{2})&d=([0-9]{2})&id=([0-9]*)$
RewriteRule ^blog/post\.php$ http://kn3rdmeister.com/blog/%1/%2/%3/%4.php? [L]

这将使得当有人http://kn3rdmeister.com/blog/post.php?y=2012&m=07&d=04&id=4输入他们浏览器的 URL 地址栏时,他们的浏览器将被重定向到http://kn3rdmeister.com/blog/2012/07/04/4.php并且新的 URL 将出现在他们的地址栏中。

我假设你已经在你的服务器上设置了一些东西来处理像blog/2012/07/04/4.php.

于 2012-07-09T01:41:38.437 回答
0

首先你应该定义你的 URLs!!!

像:

/blog节目front page

/blog/1234节目post 1234

/blog/date/2012节目posts by year

/blog/date/2012/06节目posts by year and month

/blog/date/2012/06/01节目posts by year and month and day

等等...

第一个选项是将您定义的每个 URL 重写为 index.php。您的 index.php 只需处理提交的 GET 参数。

### Do only if rewrite is installed
<IfModule mod_rewrite.c>

### Start rewrite and set basedir
RewriteEngine on
RewriteBase /

### Rewrite only if no file link or dir exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

### Rewrite frontpage
RewriteRule ^blog$ /index.php?action=showfront [L,QSA]

### Rewrite post
RewriteRule ^blog/([0-9]+)$ /index.php?action=showpost_by_id&id=$1 [L,QSA]

### Rewrite posts by date
RewriteRule ^blog/date/([0-9]{4})$ /index.php?action=showposts_by_date&year=$1 [L,QSA]
RewriteRule ^blog/date/([0-9]{4})/([0-9]{2})$ /index.php?action=showposts_by_date&year=$1&month=$2 [L,QSA]
RewriteRule ^blog/date/([0-9]{4})/([0-9]{2})/([0-9]{2})$ /index.php?action=showposts_by_date&year=$1&month=$2&day=$3 [L,QSA]

### Rewrite posts by tag
RewriteRule ^blog/tag/([a-zA-Z0-9_-]+)$ /index.php?action=showposts_by_tag&tag=$1 [L,QSA]

</IfModule>

在 index.php 中测试: print_r($_GET); print_r($_POST);

第二种选择是重写所有 URL,您的 index.php 需要处理所有可能的 URL。因此,首先它需要一个类似于路由器的东西,它将传入的 URL 分成几部分,然后发送请求的页面或错误页面。我一开始会尝试这个血腥的学校。

<IfModule mod_rewrite.c>

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^ index.php%{REQUEST_URI} [L]

</IfModule>

在 index.php 中测试:

print_r(explode('/', ltrim($_SERVER['PATH_INFO'], '/')));
print_r($_GET);
print_r($_POST);

第三种选择是使用 PHP 框架。框架可以帮助您快速编写代码。它为您提供了许多基类,例如路由器。(例如 ZendFramework、Flow3、Kohana、Symfony、CodeIgniter、CakePHP、yii 等)。这会让你更先进。

第四个也是最懒惰的选择是使用现成的软件,如 Wordpress。

于 2012-07-09T12:32:33.647 回答