0

我有一个正在开发的网站,但我很生气我必须使用丑陋的 URL。所以,我有一个http://example.com/user.php?id=54和另一个http://example.com/foobar.php?name=Test的 URL 。

我怎样才能将它们都转换为漂亮的 URL,而不将它添加到 .htaccess 中以获取我想要制作的每个 URL?

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]
4

2 回答 2

0

我将来可能会删除此答案,因为它可能特定于我的设置。


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

我会创建一些登录页面(例如index),它将成为您的应用程序路由器:example.com/index/<model>/<id>/。内部索引将是您的路由代码。我将使用 Perl 来演示,因为它比 PHP 更好 :) 注意index可以被称为 Apache 可以处理的任何东西(例如router.phpindex.plapplication.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 旨在为您处理路由,但能够在您的应用程序代码所在的位置附近进行管理会带来一些便利。

我还没有实现这个方法,所以我很想知道这是否被使用过,以及是否有任何理由不信任它。

于 2014-07-20T15:00:46.267 回答
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传递参数。

于 2014-07-20T10:28:33.040 回答