【问题标题】:Htaccess rewrite for dynamic file name and rewrite pathHtaccess 重写动态文件名和重写路径
【发布时间】:2021-07-07 18:22:54
【问题描述】:

我正在尝试进行重写,如果页面不存在,它会重写到类别页面。它与普通的 RewriteCond %{REQUEST_FILENAME} -f 有点不同,因为页面名称是基于 URL 的动态的。

如果有人访问动态路径名,例如“/contacts”

我首先希望它根据路径名检查以下文件夹/文件是否存在:

/[dynamicpath]/[dynamicpath].php

示例:

/contacts/contacts.php

如果不存在,请改写到下一页

/categories/category/category.php?cat_url=[dynamicpath]

示例:

/categories/category/category.php?cat_url=contacts

我尝试了以下方法,但是当文件存在并直接进入类别重写时,它会因第一个 RewriteRule 触发而失败。

RewriteCond %{SCRIPT_URL} ^(.+)
RewriteCond %{DOCUMENT_ROOT}/%1/%1.php !-f
RewriteRule (.+)/?$      $1/$1.php  [QSA,L]

RewriteRule ^([\w-]+)/?$                /categories/category/category.php?cat_url=$1        [QSA,L]

【问题讨论】:

  • 抱歉不清楚。能否请您用示例编写需求而不显示尝试的代码作为示例。
  • 嗨,我已经重写了问题,希望这可以简化问题

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

您可以在站点根目录 .htaccess 中使用这些规则:

RewriteEngine On

# attempt rewrite to /[dynamicpath]/[dynamicpath].php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1/$1.php -f
RewriteRule ^(.+?)/?$ $1/$1.php [L]

# else rewrite to categories/category/category.php?cat_url=...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/?$ categories/category/category.php?cat_url=$1 [QSA,L]

【讨论】:

  • 这不起作用,它会产生与 403 响应相同的错误。服务器日志显示以下内容:“AH01276:无法提供目录 /var/www/vhosts/example.co.uk/httpdocs/contacts:找不到匹配的 DirectoryIndex(无),并且选项指令禁止服务器生成的目录索引”
  • 您是否从子目录 .htaccess 而不是站点根目录 .htaccess 运行上述规则?
【解决方案2】:

我通过检查正在传递的服务器变量找到了答案,发现 %{REQUEST_FILENAME} 包含完整的文件路径(document_root+filename)。

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}%{REQUEST_URI}.php -f
RewriteRule ^(.+)/?$ $1/$1.php [L]

RewriteRule ^(.+)/?$ categories/category/category.php?cat_url=%{REQUEST_URI} [QSA,L]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2014-09-18
    • 1970-01-01
    • 2018-09-04
    • 2011-11-09
    相关资源
    最近更新 更多