如何使用.htaccess创建友好的URL?

时间:2010-06-13 18:31:51

标签: php url .htaccess url-rewriting

我很难用.htaccess。我想为我正在处理的网站创建友好的URL ...

基本上我想转换它:

http://website.com/index.php?ctrl=pelicula&id=0221889
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters

进入这个:

http://website.com/pelicula/0221889/
http://website.com/pelicula/0221889/posters/

如果我以后需要它,我也想知道如何将文章标题添加到URL的末尾(我正在使用PHP):

http://website.com/pelicula/0221889/the-article-name/
http://website.com/pelicula/0221889/the-article-name/posters/

注意:Stackoverflow方法对我也有好处,例如这个问题的网址是:

http://stackoverflow.com/questions/3033407/htacces-to-create-friendly-urls-help-needed

但你可以把任何东西放在id之后,它也会起作用。像这样:

http://stackoverflow.com/questions/3033407/just-anything-i-want

我使用了一些自动网络工具来创建.htacces文件,但它无法正常工作。所以我请求你的帮助。

如果你能推荐.htacces最佳实践和建议,我也很高兴。

编辑:基于我得到的一些答案我把它放在这里:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
</IfModule>

但是我找不到默认主机'页面'错误。

我也尝试过:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^/]+)/(\d+)/([^/]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
    RewriteRule ^([^/]+)/(\d+)/?$         index.php?ctrl=$1&id=$2 [QSA,L]
    RewriteRule ^([^/]+)/?$               index.php?ctrl=$1 [QSA,L]
</IfModule>

这也行不通。它将我带到我的默认404.php页面。

mod_rewrite已启用并正常工作。

帮助!

8 个答案:

答案 0 :(得分:7)

http://website.com/的文档根目录中,我添加了htaccess这样的文件:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

然后在PHP脚本中,您可以随意操作$_GET['url']变量:

$path_components = explode('/', $_GET['url']);
$ctrl=$path_components[0];
$id=$path_components[1];
$tab=$path_components[2];

答案 1 :(得分:7)

刚刚在本地进行了测试,似乎可以满足您的需求:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^/.]+)(?:/)?$ /index.php?ctrl=$1 [L]
    RewriteRule ^([^/.]+)/([^/.]+)(?:/)?$ /index.php?ctrl=$1&id=$2 [L]
    RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)(?:/.*)?$ /index.php?ctrl=$1&id=$2&tab=$3 [L]
</IfModule>

这就是它的作用:

这些重写可以使用或不使用尾部斜杠 - 如果您希望它们仅使用而不使用斜杠,请从前两次重写的末尾删除(?:/)?。您还可以使用mod_rewrite根据需要添加或删除尾部斜杠。

答案 2 :(得分:0)

第一个假设您的.htaccess文件位于根目录中:

RewriteRule ^([a-zA-Z]+)/([0-9]+)(/)?$ index.php?ctrl=$1&id=$2

第二个:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)(/)?$ index.php?ctrl=$1&id=$2&tab=$3

或者它总是posters而不是不同的标签:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/posters(/)?$ index.php?ctrl=$1&id=$2&tab=posters

我添加了(/)?,这意味着URI可以使用或不使用尾部斜杠。

至于另一个我可能总是将文章保留在最后,所以重写或添加另一个/value,以便重写知道选项卡和文章之间的区别或从正则表达式排除破折号。

答案 3 :(得分:0)

要拥有此网址:

http://website.com/pelicula/0221889/posters

改写为:

http://website.com/index.php?ctrl=pelicula&id=0221889&tab=posters

我会这样做:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
</IfModule>

你必须选择是否要将标题放在id之后并一直这样做,因为tab变量位于最后位置:你必须知道它是3号还是4号。 如果你这样做:

RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)$ index.php?ctrl=$1&id=$2&tab=$4 [QSA,L]

未捕获第三个括号,因此可以包含任何内容。

希望有所帮助

答案 4 :(得分:0)

确保目录树中没有任何其他.htaccess文件位于与您网站的.htaccess冲突的位置。

答案 5 :(得分:0)

我在.htaccess文件

中使用此功能
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* rewrite.php [L]

基本上如果它不作为文件或目录存在,请使用rewrite.php并让它处理URL解析等。这是我认为最重要的基本方法。

另外,查看var_dump($_SERVER)(您知道的地方)的结果,看看您认为最顶层的目录是否真的是最顶级的目录,例如:您可能正在写入/var/www/domain/www/index.php而不是/var/www/domain/index.php {{1}}

答案 6 :(得分:0)

根据经验,我建议调整您的URI方案,以便更容易将规则应用于您知道重写的URI。例如

转换它:

http://website.com/index.php?ctrl=pelicula&id=0221889
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters

进入这个(我已经把“东西”这个词,但这真的应该是描述你可能会找到的东西,即“购物”或“图书馆”或其他任何内容):

http://website.com/stuff/pelicula/0221889/
http://website.com/stuff/pelicula/0221889/posters/

要实现此目的,您需要将.htaccess文件放在网站的顶级文件夹中,该文件夹包含以下规则:

RewriteEngine on
RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L,NC,QSA]
RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA]

通过将“stuff”作为地址的一部分(重命名为适当的名称),您不会意外地重写其他资产,例如图像,CSS包含和JavaScript包含。

作为旁注,你提到过:

  

这也行不通。它将我带到我的默认404.php页面。

您的404错误重定向在哪里宣布?

答案 7 :(得分:0)

RewriteRule ^ stuff /([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php?ctrl = $ 1&amp; id = $ 2&amp; tab = $ 3 [L,NC,QSA] RewriteRule ^ stuff /([^/.]+)/([^/.]+)/?$ index.php?ctrl = $ 1&amp; id = $ 2 [L,NC,QSA]