如何修复使用带有 htaccess 重写规则的 SEO URL 时的 404 错误

问题描述 投票:0回答:2

我的根目录/页面中有页面 类似 object.php 的页面

在这些页面上,我通过 GET 获取 seo_url,在 object.php 页面上的脚本中,我搜索此 seo_url 并通过数据库查询获取它的 id

问题是,当您访问 mysite.com/object/car/ 时,404 页面会被重定向。为什么会发生这种情况以及在我的情况下如何正确制作 SEO 网址?

那是我的htaccess

RewriteEngine On
RewriteBase /

Options +FollowSymLinks
php_flag display_errors off
php_flag allow_url_fopen off
php_value error_reporting 0

# SSL
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#catalogue
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^object/(.*)$ object.php?seo_url=$1 [L,QSA]

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

这就是我的index.php

$url = $_SERVER['REQUEST_URI'];
$url = explode('?', $url)[0];
$pages = scandir($_SERVER['DOCUMENT_ROOT'] . '/pages'); 

$found = false;

foreach ($pages as $page) {  
    
    if ($page !== "." && $page !== "…") { 
        $page_name = pathinfo($page, PATHINFO_FILENAME); 
        if ($url === "/" . $page_name) { 
            include $_SERVER['DOCUMENT_ROOT'] . "/pages/" . $page; 
            $found = true; 
            break; 
        } 
    } 
}

if ($url === '/') { 
    include $_SERVER['DOCUMENT_ROOT'] . "/pages/main.php"; 
    $found = true; 
}

if (!$found) { 
    include $_SERVER['DOCUMENT_ROOT'] . "/pages/404.php"; 
} 

在object.php中

$seo_url = $_GET["seo_url"];

$id = $objects->seo_url_object($seo_url);  (here is a sql query to search for id by seo_url)

请帮忙。当我点击链接 mysite.com/object?seo_url=car 时,一切正常,当我点击链接 mysite.com/object/car/ - 错误 404

php url slug
2个回答
0
投票

嗨,我认为第一步是您必须检查 .htacess 是否正常工作 所以使用此链接检查 .htaccess 是否启用 https://askubuntu.com/questions/421233/enabling-htaccess-file-to-rewrite-path-not-working

htaccess checking


0
投票

我已经提供了代码,请检查一下。

echo $currentURL = $_SERVER['REQUEST_URI'];;

// Split the URL by '/' into an array
$urlParts = explode('/', $currentURL);
echo "<pre>";
print_r($urlParts);
$requestPage = "";
if(isset($urlParts[1]) && $urlParts[1] == "object")
{
  $requestPage = $urlParts[2];
}



$pages = scandir($_SERVER['DOCUMENT_ROOT'] . '/pages'); 
//echo "<pre>";
$found = false;
//print_r($pages);
foreach ($pages as $page) {  
    //print_r($page);
    if ($page !== "." && $page !== "…") { 
        $page_name = pathinfo($page, PATHINFO_FILENAME); 
        print_r([$requestPage,$page_name]);
        if ($requestPage == $page_name) { 
          echo "found page";
            include $_SERVER['DOCUMENT_ROOT'] . "/pages/" . $page; 
            $found = true; 
            break; 
        } 
    } 
}
if ($url === '/') { 
    include $_SERVER['DOCUMENT_ROOT'] . "/pages/main.php"; 
    $found = true; 
}

if (!$found) { 
    include $_SERVER['DOCUMENT_ROOT'] . "/pages/404.php"; 
} 

成功后,您已删除 echo、print_r。 local system screen short

© www.soinside.com 2019 - 2024. All rights reserved.