htaccess RewriteCond and RewriteRule
我实际上正在开发一个小的 php webiste,我决定尝试使用 htaccess 文件给它一些漂亮的和清理 url。我已经阅读了一些关于它的文档并创建了一个带有一些规则的简单文件,事情是它在工作但部分工作。
这就是我所做的:
我添加了一个 RewriteRule 以将 "www.mysite.com/hello" 重定向到 "www.mysite.com/index.php?action=hello"。
这工作正常,问题是我想隐藏 "index.php?action=" 部分,如果它出现的话。因此,如果 somoene 输入类似 "www.mysite.com/index.php?action=hello" 的内容,它将在 url 字段中转换为 www.mysite.com/hello"。
为此,我写了以下内容:
1 2
| RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\\ /index\\.php\\?action=([^\\ ]+)
RewriteRule ^index\\.php$ /%1? [R=301,L] |
遗憾的是它只隐藏了 url 的 index.php 部分,"?action=" 部分仍然存在。
我做错了什么?
问候。
编辑:我正在 wamp 本地测试这个
你已经很接近了。规则中的正则表达式试图匹配 article.php,但条件表明请求必须针对 index.php,因此该规则不太可能运行。试试:
1 2 3 4 5 6 7
| RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\\ /index\\.php\\?action=([^&\\ ]+)
RewriteRule ^index\\.php$ /%1? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?action=$1 [QSA,L] |
并确保该规则在内部重写为 index.php.
的规则之前
- 我一直在做错事,我做了更改,但它不仅没有按计划工作,而且似乎它阻止了我的 js 和 css 文件的加载...我将在几秒钟内发布我的代码:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\\ /index\\.php\\?action=([^&\\ ]+) RewriteRule ^index\\.php$ /%1? [R=301,L] RewriteRule ^(.+)$ index.php?action=$1 [QSA,L]
-
还更正了article.php,这是我在论坛上写代码时的错字,我的实际文件有index.php。编辑:当我浏览论坛时,我似乎首先从你那里得到了这个代码嘿嘿(stackoverflow.com/a/11638279)
-
@g6431827 你的条件都混乱了。之前,我的意思也是在条件之前。重写条件仅适用于紧随其后的规则,您不能只是在条件和规则之间添加新内容。条件和规则必须以正确的顺序结合在一起。
-
好的,所以我扔掉了不太有用的东西,让我的事情变得更容易:我只剩下 4 句话了。第一个是 RewriteEngine On,然后第二个是 RewriteRule ^(.+)$ index.php?action=$1 [QSA,L]。这应该将"www.mysite.com/hello"之类的任何请求重定向到"www.mysite.com/index.php?action=hello",对吗?第三,我有 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\\ /index\\.php\\?action=([^&\\ ]+)。最后是 RewriteRule ^index\\.php$ /%1? [R=301,L]
-
@g6431827 不,您希望重定向规则(带有 R 标志)位于重写为 index.php 的规则之前。而且您需要那些针对 index.php 重写的条件,否则它们将不起作用。
-
感谢您的编辑,但它仍然失败......也许我应该更改一些 wamp 配置文件,我不知道。我使用了你给我的代码,当我输入"localhost/website/index.php?action=hello"时,url 仍然没有转换为"localhost/Template/hello"。无论如何,我会试着睡一觉,稍后我会再试一次。 (累了不帮忙嘿嘿)
-
@g6431827 你的问题没有提到任何关于 /website/index.php 或 /Template/ 的内容。这改变了一切。您需要更改规则中的所有路径以完全匹配这些路径。
-
哦,所以当我在本地测试东西时,它与我将它放在网上时的样子不同?我的意思是我的项目的根目录(现在是模板 [它是网站,但我现在将其重命名] 位于 wamp 的 www 文件夹中)与 www.mywebsite.com 相同,如果我把它放在网上的话。猜我错了:p