【问题标题】:mod_rewrite stopped working all of a suddenmod_rewrite 突然停止工作
【发布时间】:2015-12-03 08:22:26
【问题描述】:

我在 htaccess 文件中有以下 mod_rewrite 代码。自从我写它以来,它在过去的几个月里一直运行良好。但是今天早上突然之间它完全停止了工作。有什么想法可以解决这个问题吗?

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]

RewriteRule ^([\w-:/]+)$ index.php?modname=$1

** 这是我的原始完整代码 - 未编辑 ***

ErrorDocument 404 "<H1>Page not found</H1>"
ErrorDocument 403 "<H1>Access denied</H1>"

RewriteEngine On

## REQUIRE SSL RULE
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

# browser requests PHP
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

# check to see if the request is for a PHP file:
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]

RewriteRule ^([\w-:/]+)$ index.php?modname=$1

看来 mod_rewrite 确实有效,因为我按照在线指南做了一个基本的 mod_rewrite,如下所示:

RewriteRule cat/(.*)/(.*)/$ /test.php?$1=$2

如果我打开 url mydomain/cat/product/123/,它似乎可以工作

* 更新 *

作为临时解决方案,我添加了一个自定义 404 页面,如下所示:

ErrorDocument 404 error404.php

然后在 error404.php 文件中,我包含 index.php 以与 mod_rewrite 相同的方式工作,即应用以下代码:

$modname = ltrim($_SERVER['REQUEST_URI'], '/');

这在没有 mod_rewrite 的情况下解决了问题。但这会导致我的日志文件中出现大量 404 错误,因此我真的需要深入了解重写规则不起作用的原因。

有什么建议吗?

【问题讨论】:

  • 它到底是怎么不起作用的?它触发错误消息?它以给定的方式行为不端? .htaccess 文件未解析?
  • .htaccess 文件正在工作,因为我有一个自定义的 404 代码。如果我转到 url: /users/adduser 它应该加载 index.php?modname=users/adduser 但我不断收到 404 错误,这意味着它没有应用 mod_rewrite
  • 我没有省略相关代码,我只是在该规则有效时删除了有关 SSL 的部分内容,但后来编辑了帖子以将其包含在底部。我现在将编辑帖子并添加未修改的整个代码
  • 我看到你编辑了 我的主机没有启用 mod_rewrite 问题。我的评论指的是那个,所以我会删除它以避免混淆。
  • 什么不起作用?你能用几句话解释一下吗?您无法访问您的网页吗?它是否返回循环错误?或者别的什么

标签: apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

我不确定它之前是否按原样工作,但您在最后一个 RewriteRule 指令的正则表达式模式中有错误。定义的字符集是:

([\w-:/]+)

其中,- 字符的位置会导致问题。将符号放在字符集的开头或结尾:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(\S+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

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

RewriteRule ^([-\w:/]+)$ index.php?modname=$1

【讨论】:

  • 是否有更简单的方法来完成上述操作?基本上我要做的就是在 mydomain.com/ 之后获取所有内容的 REQUEST_URI,然后我只是尝试应用 RewriteRule 规则将该 REQUEST_URI 字符串放入 index.php?modname=value_of_request_uri
  • @Ahmed 您能否确认mod-rewrite 确实已启用?在上面的 htacccess 中放一些随机字符来破解,看服务器是否抛出 500 错误。
  • 它似乎并没有破坏它,但我感觉它们是外部文件夹中的 .htaccess 替换 .php 文件。但是,必须启用 mod-rewrite,因为如果我删除现有代码并放入 RewriteRule cat/(.*)/(.*)/$ /test.php?$1=$2 那么这种方法似乎有效
  • @Ahmed 提供您的文件夹结构
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 2021-02-01
  • 2016-12-29
  • 2018-05-09
  • 2015-12-07
  • 2015-08-23
  • 2014-02-05
相关资源
最近更新 更多