核心PHP

时间:2016-07-20 06:29:52

标签: php .htaccess

我已经浏览了干净网址上的多个线程,但我仍然对它感到困惑。我想在核心php网站中使用干净网址策略。我为多个网址更改了我的.htaccess文件。但我的以下代码可以正常工作仅限一页(一个网址)

 # Turn on the Rewrite Engine
 RewriteEngine on
 # Rewrite for buyleads.php
 RewriteRule ^buyleads buyleads.php [NC,L]
 ## NC makes the rule non case sensitive
 #L makes the last rule that this specific condition match

 # Rewrite for search.php?u=xxx

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$  search.php?cat=$1 [L]



 # Rewrite for search.php?u=xxx&subcat=xxx

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^([^/]+)/([^/]+)$  search.php?cat=$1&subcat=$2 [L]
 # Rewrite for detail.php?u=xxx

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/([a-z0-9]+)$ /detail.php?id=$1 [L]

问题1.上面的代码仅适用于search.php,如果我输入www.sitename.com/detail/29(detail.php代码),则其工作方式类似于www.sitename / 29(search.php)。我在其中犯了什么错误

问题2.我也想知道是否真的可以通过.htaccess文件制作这样的所有网址?有没有办法在核心php中创建?

问题3.最后我想知道如何通过.htaccess自动重定向到清理网址,就像单击用户后点击这一点一样,请访问www.sitename.com/34/50。

提前致谢

2 个答案:

答案 0 :(得分:3)

关于您的问题:

  1. 您的第二次重写规则不会排除以detail/开头的网址,因此您的第三条规则将永远不会到达,因为第二条规则会搜索类别detail和子类别29(在你的具体例子中)。您可以从第二条规则中排除detail/,但您也可以更改第二条和第二条规则的顺序,以使其有效。
  2. 是的,你可以重写所有的网址,并在php中使用你的逻辑。您可以将原始路径作为参数发送,并在php中解析/分析。
  3. 您应该正确生成链接以开始。这样,您就不必重定向,也不必告诉搜索引擎在重定向时永久移动页面。
  4. 第2点的一个小例子:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$  /index.php?url=$1 [L]
    

    现在所有网址都会被重写,在您的脚本中,您可以在$_GET['url']

    中获取原始网址/路径

答案 1 :(得分:0)

这对于在 Apache 配置(httpd.conf 或 apache2.conf)中使用语言/内容协商以及重写规则的所有页面都是可能的。不需要使用 .htaccess 文件。

在 apache2.conf 文件(或 httpd.conf)中添加 Multiviews 指令、MultiviewsMatch 指令,以及这些重写规则

<Directory /var/www/html>
    Options Indexes FollowSymLinks Multiviews
    AllowOverride None
    Require all granted

    RewriteEngine On
    RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
    RewriteRule ^ /%1 [NC,L,R]

    <Files "*.php">
        MultiviewsMatch Any
    </Files>
</Directory>

然后保存文件并重启Apache sudo systemctl restart apache2

当您在 apache2.conf 中声明更多指令时,请为每个指令重复 Multiviews 指令:

<Directory /var/www/html/example.com/>
  Options FollowSymLinks Multiviews
  AllowOverride All
  Require all granted
</Directory>

确保在 apache2.conf 中启用/取消注释 rewritenegotiation 模块:

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule negotiation_module mod_negotiation.so