【问题标题】:Transform GET vars from PHP into friendly URLs?将 GET 变量从 PHP 转换为友好的 URL?
【发布时间】:2015-01-04 14:51:49
【问题描述】:

我遇到了一个非常常见的问题,我需要将我的 site.com/page.php?id=1&title=page-title 转换为 site.com/page-title-id

我认为这可以很容易地在 .htaccess 文件中添加一些 mod_rewrite ,但我觉得这可能不是最适合 SEO 的方法,你觉得呢?

另一种方法是在 PHP 代码中进行一些更改,但我对这种语言相对较新,我不了解 PHP 附带的所有库和函数,这些库和函数可以让我的生活更轻松。

到目前为止,我在我的 .htaccess 中正在做什么(这不起作用):

# BEGIN ocasion_system
<IfModule mod_rewrite.c>
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php\?title=([^&\s]+)&?
RewriteRule (.*)\.php$ /$1/%1/? [L,R=301]

RewriteRule ^([^/]+)/([^/]+)/$ $1.php?title=$2 [QSA,L]
</IfModule>

而我的 page.php 有

//all includes up here..
$page = new Page();
$page->__set('title', $_GET["title"]); //this is how i set up my page interface, please don't laugh

if ($_GET["title"] != NULL){    
        $page = get_page($page, $db);       
        echo '<pre>';
        print_r($page);//works as intended when i access http://localhost/page.php?title=default prints all the Page object with that title.
        echo '</pre>';
    }

我想 PHP 的解决方案会更好,因为我不想让搜索引擎认为我在隐藏网站或重定向或任何东西,只是希望 URL 像 site.com/page-title- id 或类似的。

编辑:在 .htaccess 中尝试了不同的方法

【问题讨论】:

  • 目前还不清楚您要做什么,但这里有一些想法。 (1) 使用 htaccess 即可;它实际上比尝试仅在 PHP 中完成这一切要好。 (2) 您的 RewriteRules 没有任何 title 参数,但这正是您在 PHP 脚本中寻找的。​​span>
  • @EdCottrell 这取决于。我通常更喜欢将所有请求重定向到 index.php 并拥有一个构建良好的 Router 对象来处理我的路由。
  • @SecondRikudo 我可能应该更清楚。我和你一样,但你仍然需要以某种方式进行重定向,通常是 htaccess。无论如何,它与伪装无关。
  • @EdCottrell No....所有请求在内部映射到 index.php,index.php 读取客户端指定的 URL,并根据该 URL 确定要做什么。没有重定向。
  • @Dolan 不清楚的部分是您在 PHP 代码中查找 $_GET['title'],但在您的 RewriteRules 中只有 ...page=...。我不确定您希望 title 参数来自哪里。

标签: php apache .htaccess mod-rewrite


【解决方案1】:

我需要将我的 site.com/page.php?id=1&title=page-title 转换为 site.com/page-title-id

您可以用这个替换您当前的 htaccess 代码(假设它位于文档根文件夹中)

<IfModule mod_rewrite.c>
  Options +FollowSymLinks -MultiViews

  # Turn mod_rewrite on
  RewriteEngine On
  RewriteBase /

  RewriteCond %{THE_REQUEST} \s/page\.php\?id=([0-9]+)&title=([^\s&]+)\s [NC]
  RewriteRule ^ %2-%1? [R=301,L]

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^([^/]+?)-([0-9]+)$ page.php?id=$2&title=$1 [L]
</IfModule>

此代码会将旧 url 格式 (http://example.com/page.php?id=1&title=page-title) 重定向到新格式 (http://example.com/page-title-1),然后在内部将新格式重写回旧格式(没有任何无限循环)

【讨论】:

  • 好的,我将我的 .htaccess 移动到我的 index.php 文件所在的位置,但仍然无法正常工作,我将更多地查看 apache 配置文档,并在我得到它后立即将您的问题标记为正确在职的。谢谢。
  • 对不起,但是当我转到 site.com/page/default-2 时,它不断给出 404 消息:\
  • 您没有提到 /page/ 子文件夹,因此此代码无法正常工作。请提供您需要的真实网址(新旧格式)
  • 你启用了 mod_rewrite 吗?您是否在 apache 配置中允许使用 htaccess 文件?另外,您的 htaccess 中还有其他规则吗?
  • 例如,您可以简单地使用ErrorDocument 404 /error.php?id=404(没有重定向,但对于搜索引擎来说是一种更好的方法)
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 2012-07-27
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2014-06-22
相关资源
最近更新 更多