【问题标题】:how do I get rewrite rules working from the apache .htaccess while CSS and javascript files are not rewritten?如何在不重写 CSS 和 javascript 文件的情况下从 apache .htaccess 获取重写规则?
【发布时间】:2021-12-01 14:44:37
【问题描述】:

已通过其他建议的问题,但没有运气。 这些是我的 .htaccess 重写规则,主要是为了 SEO 和用户友好的目的:

Options +SymLinksIfOwnerMatch

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} !^/(images|css|js|scripts/.*)$
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # RewriteRule ^dictionary/(.*) dictionary.php [NC,L]
    RewriteRule . /index.php [L]
    RewriteRule ^dict/[^/]+/[^/]+/(.+)$ $1  [L]
</IfModule>

如果我取消注释重写规则,因此任何对www.xyz.com/dictionary 的请求并在内部重写为www.xyz.com/dictionary.php,并添加任何查询字符串,整个站点将停止工作。

我想要的是对文件夹 JS、CSS、图像和脚本的任何请求都不会被重写(所以我没有得到 /dictionary.images/xyz.jpg),并且 dictionary.php 中包含的 php 文件不会被重写.

任何对现有目录的请求都不会被触及,但是如果一个不存在的目录被重写到/index.php

我怎样才能让重写的“假”目录被重写?我还有大约 5 个要重写的假目录,并且 CSS、JavaScript 和图像是从正确的路径加载的?

【问题讨论】:

  • 您发布的代码已经将 CSS、JS 和图像排除在重写之外(除非 URL 路径以 dict 开头)。您的实际问题是静态资源没有加载是因为浏览器从错误的 URL 路径深度请求它们吗?您是否使用静态资源的相对 URL 路径?如果是这样,请参阅网站管理员堆栈上的以下问题:.htaccess rewrite URL leads to missing CSS
  • 感谢怀特先生。我现在修改了路径,就好像文件在目录中一样,因为文件在站点根目录中并且有一个指向 css/abc.css 的 URL,但现在我将路径设置为 /css/abc.css 并且一切都很好。

标签: php apache .htaccess url-rewriting seo


【解决方案1】:

重写条件仅适用于下一条规则。当您在 index.php 规则及其上方的重写条件之间插入“字典”规则时,它们将停止应用该规则并破坏您的站点。您需要在其他地方添加新规则。

我建议添加新行以强调哪些条件符合哪些规则。

您的dictdictionary 规则需要靠近顶部,这样这些路径就不会被您的front controller (index.php) 处理

试试:

Options +SymLinksIfOwnerMatch

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^dict/[^/]+/[^/]+/(.+)$ $1  [L]

    RewriteRule ^dictionary/(.*) dictionary.php [NC,L]

    RewriteCond %{REQUEST_URI} !^/(images|css|js|scripts/.*)$
    RewriteRule ^index\.php$ - [L]

    RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

</IfModule>

【讨论】:

  • 感谢@Stephen,重定向工作完美,URL 没有改变 :)
  • 还有 1 个问题,斯蒂芬(或其他任何可以给我方向的人)。如果 URL 是 ww.xyz.com/dict 我会得到主页,但如果我这样做 www.xyz.com/dict/ 我会得到正确的内部 URL 重写。我应该把规则写两次,一次用结尾的反斜杠,另一次没有,还是有一些神奇的正则表达式技巧?
  • 如果通过“神奇的正则表达式技巧”,您的意思是通过使用带有 ? 的括号使斜杠及其后面的所有内容成为可选:RewriteRule ^dict(?:/[^/]+/[^/]+/(.+))?$ $1 [L]
  • @AldoCauchiSavona “如果我这样做 www.xyz.com/dict/ 我会得到一个正确的内部 URL 重写” - 你的意思是 /dictionary/ 吗?使用上述规则,对/dict/dict/ 的请求都不会触发重写(可能对前端控制器的请求除外,即index.php)。
  • @MrWhite,使用上述规则 www.xyz.com/dict/ 有效,而不是 www.xyz.com/dict(没有最后的反斜杠)。我目前正在将文件转换为友好的目录结构。最终我将处理查询字符串,我已经看到文章/帖子,其中查询字符串作为 url 中的目录,但首先会使用目录运行站点
猜你喜欢
  • 2015-12-25
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多