我有数百个动态创建的 URL - foo.com/123、foo.com/contact 等等。
我想将所有这些 URL(不知道全部,只知道有 az 或 1-9)重定向到 foo.com。
请让我知道如何使用 apache 重写规则来实现这一点
我努力了 :
RewriteRule ^(.*)$ index.php
但这并不管用。
答案1
正如 Brian 上面所回答的:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php [R=301]
正如上述克里斯所建议的:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php [R=307]
如果您尝试进行内部重定向,则 URL 不会在浏览器中重写:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php
Brian 的方法将执行 301 重定向。这将告诉任何搜索引擎/浏览器/缓存,内容已永久移动,现有 URL 已消失,不应使用。Chris 的方法将执行 307 重定向。307 相当于 HTTP/1.1 中的临时重定向。两者都将在浏览器中重写 URL,两者都会导致访问该网站的人单击该 URL 并被重定向到新的 URL foo.com/index.php。最后一种方法将在内部重写 URL,以便浏览器中的 URL 仍然是 foo.com/contact,而不是 foo.com/index.php
这些规则实际上都不会将任何参数传递给 index.php,因此 301 和 307 重定向实际上会丢失 URL 的其余部分。如果您使用 301/307 重定向将所有内容重定向到门户页面,则此行为可能是可以接受的。如果这是您的意图,我建议使用:
ErrorDocument 404 /index.php
然后确保该页面中的所有图像/链接都是相对/绝对链接的,或者使用以确保在结果页面上正确重写 URL。
如果要将请求的URI作为参数传递给index.php进行解析:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php?page=$1
在这种情况下,$_REQUEST['page'] 将包含来自 foo.com/contact 的 /contact
答案2
您的重写规则将导致无限循环,因为 index.php 也匹配^(.*)$
。您应该能够使用类似以下方法(未经测试):
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php [R=301]
附加[R=301]
将返回“永久移动”重定向状态代码。
答案3
根据他的网址结构,他可能不想要 [R=301],因为他正在尝试创建漂亮的网址。