我很难用.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已启用并正常工作。
帮助!
答案 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]