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

我用.htaccess很难。 我想为我正在工作的网站创建友好的网址

基本上我想转换这个:

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 

但是,你可以把任何东西放在身份证上,也可以工作。 喜欢这个:

 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已启用并正在运行。

帮帮我!

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

只是在本地进行测试,它似乎做你所需要的:

 <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添加或删除尾部斜线。

第一个假设你的.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所以重写知道选项卡和文章之间的区别或从正则表达式中排除破折号。

要有这个网址:

 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] 

第三个括号没有被捕获,因此可以包含任何东西。

希望有所帮助

确保在与您的网站的.htaccess冲突的目录树上没有任何其他.htaccess文件。

我在我的.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

根据经验,我建议调整您的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] 

通过将地址的“东西”部分(重命名为适当的东西),您不会不小心重写其他资源,如图像,CSS包含和JavaScript包含。

作为一个方面说明,你已经提到:

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

你的404错误重定向在哪里申明?