如何自动制作漂亮的网址

时间:2014-07-20 10:17:15

标签: php apache .htaccess url pretty-urls

我有一个网站,我正在努力,但我很生气,我必须使用丑陋的URLS。因此,我的网址为http://example.com/user.php?id=54,另一个网址为http://example.com/foobar.php?name=Test

我怎样才能将它们转换为漂亮的URL而不将其添加到.htaccess中,以便我想制作漂亮的每个网址?

example.com/user.php?id=54 => example.com/user/54

example.com/foobar.php?name=Test => example.com/foobar/Test

我在.htaccess文件中有这个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^([^/]+)/?$ $1.php [L]
RewriteRule ^$1/$3/? /$1.php?$2=$3 [NC]

谢谢, 露

我的完整.htaccess文件:

# include classes on every page
php_value auto_prepend_file Resources/Classes.php

# add custom Directory Indexes
DirectoryIndex index.php Default.php Down.php

# begin routing to pretty URLs
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^/(?!Resources)([0-9a-zA-Z-]+)/([0-9]+) /$1.php?id=$2 [NC]
RewriteRule ^/(?!Resources)([0-9a-zA-Z-]+)/([a-zA-Z-]+) /$1.php?name=$2 [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

2 个答案:

答案 0 :(得分:0)

试试这个

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^user/([0-9]+) /user.php?id=$1 [QSA,L]
RewriteRule ^foobar/([0-9a-zA-Z-]+) /foobar.php?name=$1 [QSA,L]

如果你想要全局规则,你可以

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([0-9a-zA-Z-]+)/([0-9a-zA-Z-]+) /$1.php?parameter=$2 [NC]

或更具体地说

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([0-9a-zA-Z-]+)/([0-9]+) /$1.php?id=$2 [NC]
RewriteRule ^([0-9a-zA-Z-]+)/([a-zA-Z-]+) /$1.php?name=$2 [NC]

当参数为字符串时,它将传递name参数,当参数为整数时,将传递id参数。

答案 1 :(得分:0)

我可能会在将来删除此答案,因为它可能与我的设置有关。


我最近发现,使用Apache,URL后面的任何内容都填充了PATH_INFO环境变量。这意味着,根据您的示例example.com/user/54,如果user是服务器可以处理的脚本,则将其填充到PATH_INFO之后的任何内容;在这种情况下,它看起来像/54。这是一个很好的发现,因为通过适当的结构,您可以使自己的路由器类似于Rails。

我会创建一些着陆页(例如 index ),它将成为您的应用程序路由器:example.com/index/<model>/<id>/。内部 index 将是您的路由代码。我将使用Perl进行演示,因为它比PHP更好:)注意 index 可以被称为Apache可以处理的任何东西(例如, router.php index.pl application.rb );但是,删除扩展名会增加URL的美感。

指数:

#!/usr/bin/perl
use 5.012;

# Retrieve what you're looking for; obviously not production-ready
my ($model,$id) = $ENV{PATH_INFO} =~ m{^/([^/]+?)/([^/]+)};

# route the request
given($model){
   when('user'){ callUser($id); }     # callUser defined elsewhere, perhaps another script
   when('foobar'){ callFoobar($id); } # callFoobar defined elsewher, perhaps another script
   default { makePageDefault(); }
}

上面的脚本没有生产就绪,因为它没有执行任何卫生设施,也没有处理您需要的所有用例。我的猜测是你想要类似于Rails的东西(例如,example.com/movie/1/edit)。虽然Apache旨在为您处理路由,但是能够在应用程序代码所在的位置附近管理它有一些方便。

我没有实施这种方法,所以我很想知道这是否是使用过的,以及是否有任何理由不相信它。