php 如何修复:RewriteRule在.htaccess中不起作用

vof42yt1  于 2023-01-16  发布在  PHP
关注(0)|答案(1)|浏览(157)

请考虑我的.htaccess中的内容:

##
Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /

## Allow a few SEO Files direct access.
RewriteRule ^robots.txt?$ robots.txt [L]
RewriteRule ^ads.txt?$ ads.txt [L]
RewriteRule ^sellers.json?$ sellers.json [L]

## Avoid rewriting rules for the admin section
RewriteRule ^(admin|resources)($|/) - [L]

## Set Ajax Request File
RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]

## Set controller with id
RewriteRule ^([^/]+)/([0-9]+)/?$ index.php?con=$1&id=$2 [L,QSA]

## Set controller with slug
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?con=$1&slug=$2 [L,QSA]

## For paging
RewriteRule ^([^/]+)/page/([0-9]+)/?$ index.php?con=$1&page=$2 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/page/([0-9]+)/?$ index.php?con=$1&slug=$2&page=$3 [L,QSA]

## Set controller for only one parameter
RewriteRule ^page/([^/]+)/?$ index.php?con=page&slug=$1 [L,QSA]
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

## Set home page
RewriteRule ^/?$ index.php?con=home [L]

每当我尝试浏览http://example.com/kahuk-ajax/?prefix=manage-story-vote时,这会打开index.php而不是kahuk-ajax.php
我哪里做错了?

mnemlml8

mnemlml81#

## Set Ajax Request File
RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]

:

## Set controller for only one parameter
:
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

第一个规则首先将请求重写为kakuk-ajax.php,但倒数第二个规则随后在重写引擎的 * 第二遍 * 期间将其重写为index.php
您需要防止第二个规则重写kakuk-ajax.php的请求。如果这些URL在第一个路径段(通常用于分隔文件扩展名)中不包含点,则只需在求反的字符类中包含一个点即可。例如:

## Set controller for only one parameter
:
RewriteRule ^([^/.]+)/?$ index.php?con=$1 [L,QSA]

或者,排除特定的文件扩展名:

RewriteCond %{REQUEST_URI} \.(txt|json|php)$
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

或者,任何看起来具有文件扩展名的URL:

RewriteCond %{REQUEST_URI} \.\w{2,5}$
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]
  • 旁白 *
RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]

这个规则有点矛盾。您删除了带有尾随?的查询字符串,但随后又在其上追加了QSA标志。如果您希望保留查询字符串,则两者都不需要。而且由于您正在捕获URL路径,因此也可以在 substitution 字符串中使用它。例如:

RewriteRule ^(kahuk-ajax)/?$ $1.php [L]

另外,要注意允许一个可选的尾随斜杠在这里。这促进了重复的内容,可能会导致潜在的SEO问题。考虑重定向一个到另一个代替。

## Allow a few SEO Files direct access.
RewriteRule ^robots.txt?$ robots.txt [L]
RewriteRule ^ads.txt?$ ads.txt [L]
RewriteRule ^sellers.json?$ sellers.json [L]

正则表达式末尾的?使得前面的字符(上面例子中的tn)是可选的,这在这里实际上没有意义。另外,你不需要重写到同一个文件--你不希望在这里发生任何重写/替换。因此,上面的内容与以下内容相同:

RewriteRule ^(robots\.txt|ads\.txt|sellers.json)$ - [L]

-(连字符)明确表示“无替换”。
然而,在上面的(negated character class)指令中包含了一个“点”,这个指令是多余的,除了“过早失败”。

相关问题