【问题标题】:How can I get mod_rewrite to rewrite everything?如何让 mod_rewrite 重写所有内容?
【发布时间】:2016-03-17 19:05:44
【问题描述】:

我一直在努力实现的是让我的 .htaccess 文件重写所有 URL。

但是,无论我做什么,我都无法让它忽略现有目录。我的意思是,表现得好像它们不存在一样。

例如,假设我有以下文件结构:

/
    dir1
        file1.php
    dir2
        file2.php
    .htaccess

假设我想将所有流量重定向到dir1/file1.php?url=path

如果路径是现有目录,这对我永远不起作用。

例如,如果我导航到url/path/stuff/dir2,“重定向”会起作用,但地址栏中的 URL 会出于某种深不可测的原因更改为 url/path/stuff/dir2/?url=dir2

这是我的.htaccess

Options -MultiViews

Options -Indexes

Options +FollowSymLinks

# so navigating to a url with a trailing slash won't cause problems
DirectorySlash Off

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ dir1/file1.php?url=$1 [QSA,L]

【问题讨论】:

  • 您向我们展示了您所有的 .htaccess 文件吗?您是否有类似这样的行: RewriteCond %{REQUEST_FILENAME} !-f 就目前而言,您的 .htaccess 应该无限循环。
  • @BareNakedCoder 啊!这解释了很多我不明白的事情。但是我添加了一个检查,它仍然没有改变行为。 (不过我编辑了这个问题。)
  • 如果您不想在地址栏中出现?url=dir2,但仍想将数据附加到$_GET["url"],请尝试删除QSA
  • 这里有两个帖子,我发现可能与您的问题有关,stackoverflow.com/questions/990392/…stackoverflow.com/questions/12551382/…
  • @Andrew 我只是不明白为什么要更改地址栏,因为我没有进行任何重定向。这些问题有助于理解代码在做什么,但我仍然无法理解为什么要更改地址栏。

标签: php apache .htaccess mod-rewrite


【解决方案1】:

你(更新).htaccess 说:如果(它不是现有文件)那么 { 重写 URL }。好像你想要的

RewriteEngine on
RewriteCond %{REQUEST_URI} !dir1/file1.php
RewriteRule ^(.*)$ dir1/file1.php?url=$1 [QSA,L]

在这种情况下,RewriteCond 只是防止无限循环。 RewriteRule 只被应用一次。重写模块将不断循环遍历所有规则,直到循环不会导致 URI 发生更改。

【讨论】:

  • 好的,谢谢。这也让事情变得更加清晰。但主要问题仍然存在:导航到path/dir2 会使地址栏更改为path/dir2/?url=dir2,而我不希望它更改。 (尽管它仍然“显示”dir1/file1.php,所以这很好。)
  • 你试过了吗?重写为 url=dir2 仅在 Apache 内部完成,不应显示在浏览器地址栏中(除非您实际上重定向到该地址,因为您没有 [QSA,L,R],所以您没有这样做) .所有框架都使用这个技巧来调用它们的前端控制器来初始处理所有形式的请求。
  • 是的,我正在尝试各种不同的变体,但地址栏总是变为path/dir2/?url=dir2
  • 所以我做了一些日志记录,有一行似乎是错误,这出现在日志中:split uri=dir1/file1.php?url=dir2 -> uri=dir1/file1.php, args=url=dir2&url=dir2,我不明白为什么。
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多