【问题标题】:Why I get 404 not found with the .htaccess RewriteRule?为什么使用 .htaccess RewriteRule 找不到 404?
【发布时间】:2022-01-07 15:31:02
【问题描述】:

以下代码

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9a-zA-Z-_]+)$ index.php?page=$1 [L,QSA]// works
RewriteRule ^aciklama/([0-9]*)$      aciklama/?id=$1    [NC,L]//does not works


RewriteRule ^$ index.php [L,QSA]

它适用于页面,但是当我想将参数传递给另一个页面时,它会给出 404 not found

步骤 1-http://localhost/admintemplate/baker/urunler url 是产品页面,它显示产品 第 2 步-当我点击一个产品时,例如 ID=1 产品,它将是 http://localhost/admintemplate/baker/urunler/aciklama/1 但它没有显示它说 404 not found 的页面.. 有什么问题

谢谢和最好的问候..

【问题讨论】:

  • 在不起作用的行中,您有一个 ^ 表示网址的开头,请尝试仅删除 ^ 符号,因为您要替换的部分不在开头网址。
  • 你的 htaccess 文件在哪里?
  • 您好,感谢您的回复,我应用了您所说的内容,它改变了错误,它给出了内部服务器错误 500 url 上会发生什么?
  • @AmitVerma 它与 index.php 一起使用
  • 旁注: 为了让您的生活更轻松,我建议您考虑将front controller patternrouter 一起使用,而不是添加一堆特定于应用程序的在 htaccess 中重写规则。然后更容易直接在代码中设置新的 URL,以及将应用程序移动到不同的 Web 服务器(如 nginx 等)

标签: php .htaccess web url seo


【解决方案1】:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9a-zA-Z-_]+)$ index.php?page=$1 [L,QSA]// works
RewriteRule ^aciklama/([0-9]*)$      aciklama/?id=$1    [NC,L]//does not works

如果在您请求http://localhost/admintemplate/baker/urunler 时第一条规则“有效”,那么.htaccess 文件似乎位于/admintemplate/baker 子目录中,在这种情况下,第二条规则中的正则表达式应为^urunler/aciklama/([0-9]*)$(不是^aciklama/([0-9]*)$ 所述)。尽管您可能希望匹配 1 个或多个数字,而不是 0 个或多个数字并允许空的 id 参数。所以,这个正则表达式应该是^urunler/aciklama/([0-9]+)$。如果数字被省略,这将有助于避免重写循环。

但是,替换字符串 aciklama/?id=$1 仍然不完整,因为这不是一个有效的端点(它可能依赖于 mod_dir 和 DirectoryIndex)。这应该是aciklama/index.php?id=$1

第一个条件RewriteCond 指令)不需要检查请求是否映射到文件,因为正则表达式^([0-9a-zA-Z-_]+)$ 无论如何都不会匹配文件。两个RewriteCond 指令仅适用于第一个RewriteRule。正则表达式 ^([0-9a-zA-Z-_]+)$ 也不是严格正确的。字符类中的倒数第二个连字符需要进行反斜杠转义,或移动到最后一个(或第一个)位置以避免歧义。然而,这个正则表达式可以通过使用\w(word char)速记字符类来简化。 IE。 ^([\w-]+)$.

请尝试以下方法:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-]+)$ index.php?page=$1 [L,QSA]
RewriteRule ^urunler/aciklama/([0-9]+)$ aciklama/index.php?id=$1 [NC,L]
RewriteRule ^$ index.php [L,QSA]

如果DirectoryIndex 设置正确(如果前面规则中的目标有效,则必须正确设置),此规则应该是不必要的。否则,这应该设置在文件的顶部:

DirectoryIndex index.php

还有一个新问题,即 aciklama/1 页面带有非样式我的意思是设计不只有白色,还有文字我该如何解决?

这很可能是由于使用 CSS 文件(以及可能的其他静态资源)的相对 URL 路径造成的。

默认情况下,浏览器解析相对于当前 URL(在浏览器中)的相对 URL。因此,像href="mystyle.css" 这样的相对 URL 将相对于 aciklama/1 进行解析,例如。 aciklama/mystyle.css - 这可能不是本意。

如果您将 URL 重写为不同的路径深度,那么您需要使用根相对(以斜杠开头)或绝对(使用方案 + 主机名)URL,以便浏览器能够正确解析 URL。作为一种解决方法,您还可以使用 head 部分中的 base 元素来指示任何相对 URL 也应该是相对的基本 URL。

请参阅网站管理员堆栈上的以下问题,该问题更详细地介绍了在 URL 重写时使用相对 URL:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2018-05-10
    • 2012-02-17
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多