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

bz4sfanl  于 2023-05-29  发布在  其他
关注(0)|答案(7)|浏览(204)

我对. 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方法对我也有好处,比如这个问题的url是:

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

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

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

我已经使用了一些自动Web工具来创建.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已启用并工作。
救命啊

0s0u357o

0s0u357o1#

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

9njqaruj2#

刚刚在本地测试了这个,它似乎做了你需要的:

<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根据需要添加或删除尾部斜杠。

ldioqlga

ldioqlga3#

第一个假设你的.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,这样重写就知道标签和文章之间的区别,或从正则表达式中排除破折号。

lnxxn5zx

lnxxn5zx4#

确保目录树中没有任何其他.htaccess文件与站点的. htaccess冲突。

2wnc66cl

2wnc66cl5#

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

d4so4syb

d4so4syb6#

根据经验,我建议您调整URI方案,使其更容易仅将规则应用于您知道重写的URI。举个例子
转换这个:

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

我把“东西”这个词放进去了,但这真的应该是描述你可能会发现的东西的东西,iidoe。“商店”或“图书馆”或任何此内容):

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包含。

pod7payv

pod7payv7#

要获得此URL:

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变量位于最后一个位置:你必须知道它会是第三个还是第四个。如果您这样做:

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

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

相关问题