Apache 使用Mod Rewrite in.htaccess删除php扩展和参数,以创建两个seo友好URL

Apache 使用Mod Rewrite in.htaccess删除php扩展和参数,以创建两个seo友好URL,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我读过很多关于htaccess重写的文章,但是我很难让任何东西按我需要的方式工作 我在这里转了几个小时 我的文件夹里有两页 /proposal/index.php /提案/dl.php 所以正常的查询是这样的 /提案/?代码=123abc /提案/dl.php?代码=123abc 但我想像这样发送给用户: /提案/123abc/ /提案/dl/123abc/ 有人能帮我吗 短暂性脑缺血发作 注意 我确实尝试了下面的代码,该代码在index.php上运行良好,但对dl.php没有影响(如果我将dl

我读过很多关于htaccess重写的文章,但是我很难让任何东西按我需要的方式工作

我在这里转了几个小时

我的文件夹里有两页

/proposal/index.php
/提案/dl.php

所以正常的查询是这样的

/提案/?代码=123abc
/提案/dl.php?代码=123abc

但我想像这样发送给用户:

/提案/123abc/
/提案/dl/123abc/

有人能帮我吗

短暂性脑缺血发作

注意 我确实尝试了下面的代码,该代码在index.php上运行良好,但对dl.php没有影响(如果我将dl.php添加到混合中)


这可能就是您正在寻找的变体。这两个规则都捕获嵌入在请求URL中的实际参数,以便在内部重写的请求中重新使用它

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [END]

RewriteRule ^dl/([^/]+)/?$ dl.php?code=$1 [END]
RewriteRule ^([^/]+)/?$ index.php?code=$1 [END]
Yo可能还希望添加重定向规则,以使用“旧”URL重定向客户端:

为此,最好从302重定向开始,并在一切正常时将其更改为301


这两种变体都使用相对路径,因此规则在比http服务器的文档根更深的分布式配置文件中工作。我个人更喜欢在真正的主机配置中实现这些规则,而不是出于各种原因使用分布式配置文件(“htaccess”)。

最终,这是可行的

RewriteEngine On
RewriteRule ^dl/(.*) dl.php/$1 [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]
现在我可以这样称呼页面:

/提案/123abc/
/提案/dl/123abc/

我所做的就是在我的原始代码中添加下面的行

RewriteRule ^dl/(.*) dl.php/$1 [L]
我的子目录结构如下:

/提案/.htaccess
/proposal/index.php
/提案/dl.php

现在,我可以为这两个文件的客户端提供漂亮的URL,并使用我的参数调用它们的内容,如:

/提案/123abc
/提案/dl/123abc

正常情况下是这样的

/proposal/index.php?code=123abc或/proposal/?code=123abc

/提案/dl.php?code=123abc

请多花点时间修改您的问题。目前的形式还不清楚:“dl.php”和“download.php”是否相同?那么请在问题中给它起同样的名字。什么是
/proposal/?code=123abc
?这与你解释的其余部分不符。请更清楚地说明这些细节。什么是/proposal/?code=123abc?这将是index.php。我想这很清楚,因为这几乎是目录的默认文件类型。我还删除了download.php并用dl.php对其进行了编辑。我怀疑您发布的代码对您在问题中提到的任何示例请求是否有任何影响,无论它是针对index.php脚本还是dl.php。该规则甚至不尝试从传入的请求中捕获参数……感谢您的努力,但我现在在index.php和dl.php上都出现了404错误。就像我在OP中提到的,我已经尝试了100种不同的变体,但都无法实现。我只能在index.php页面上使用它。我的OP中的代码只在index.php而不是dl.php上工作。如果您得到4040,这意味着index.php和dl.php不在http服务器的根目录中。你的问题中没有提到这一点。我修改了答案,使用了相对路径。不太健壮,效率不高,但显然您正在使用这样的设置。感谢您的帮助,尽管您的评论有点被动攻击性,但仍然感谢您的帮助。我已经测试了您修订的代码,它也可以工作。因此,出于礼貌,由于您的代码比我的代码“整洁”,我将接受您的代码作为公认的答案。谢谢你,克里斯蒂安。
RewriteEngine On
RewriteRule ^dl/(.*) dl.php/$1 [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]
RewriteRule ^dl/(.*) dl.php/$1 [L]