好的。所以我正在构建这个可以通过两个不同域访问的网站。所以我不能在我的 .htaccess 中使用 RewriteBase。我用来解决这个问题的规则(如下)似乎工作得很好。然而,当我在本地盒子上使用下面的 .htaccess 设置和干净的 URL(WAMP)时,一切都正常,但是当我在实时服务器(共享托管 LAMP)上使用它时,我导航到的每个页面都会显示主页(我猜是索引下的一个),即使浏览器中的 URL 显然正在更新。

<IfModule mod_rewrite.c>
  RewriteEngine On

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

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} ^/domain2.com/(.*)$
  RewriteRule ^(.*)$ /domain2.com/index.php?q=$1 [L,QSA]
</IfModule>

非常感谢任何帮助或想法。

  • 卢克
有帮助吗?

解决方案

也许最好的办法是在本地机器上重现问题并打开 RewriteLogLevel,以便您可以看到发生了什么。(因为您通常无法更改共享主机上的日志级别)

您可以通过在 Apache 主配置中进行目录重写来“模拟”该问题。(共享主机显然在到达 .htaccess 之前会进行自己的重写!)如果您无法重现问题,您可能必须在远程服务器上开始试错调试。这很丑陋,但如果这是你唯一的选择:

在替换中使用 R(重定向)标志将任何重写的 URL 发送回您的浏览器。使用 TELNET(或适当的浏览器插件)检查 HTTP 响应。

不要忘记在正则表达式中转义点!

附带说明一下,RewriteRule 模式在其上方的 RewriteConds 之前进行匹配。这种设置可能更有利于性能:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/domain1\.com/(.*)$ /domain1.com/index.php?q=$1 [L,QSA]
#                     ^ should be escaped

请注意,我还没有对此进行测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top