我有一个网站,我正在努力,但我很生气,我必须使用丑陋的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]
答案 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(); }
}
1
传递给callUser()5
传递给callFoodbar()diffmodel
不存在上面的脚本没有生产就绪,因为它没有执行任何卫生设施,也没有处理您需要的所有用例。我的猜测是你想要类似于Rails的东西(例如,example.com/movie/1/edit
)。虽然Apache旨在为您处理路由,但是能够在应用程序代码所在的位置附近管理它有一些方便。
我没有实施这种方法,所以我很想知道这是否是使用过的,以及是否有任何理由不相信它。