Apache 重写规则指向页面上的锚定(在其他重写规则的上下文中)

Apache 重写规则指向页面上的锚定(在其他重写规则的上下文中),apache,.htaccess,mod-rewrite,url-rewriting,Apache,.htaccess,Mod Rewrite,Url Rewriting,我在域根目录中的.htaccess文件中有以下内容 Options +FollowSymlinks RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] RewriteRule ^/ser

我在域根目录中的
.htaccess
文件中有以下内容

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteRule ^/services/(.+) /services#$1 [NE]
第一条指令强制使用HTTPS并将所有请求定向到PHP文件(例如
/services
->
/services.PHP

最后一条指令改编自,旨在将
/services
之后的路径组件重定向到该页面上的锚点(例如
/services/item
->
/services\item
)。但是,它不工作,并产生404错误

我认为这可能是由于其他规则,但删除它们并没有帮助(尝试一些变体也没有帮助,或者让服务器尝试查找
/services/item.php


如何修复此问题?是否需要将规则按不同的顺序排列?为清楚起见,我想重写URL,以便用户看不到
.php
#

我修改了规则,请检查:

    Options +FollowSymlinks
    RewriteEngine On

    RewriteRule ^services\/(.*)$ /services#$1 [R=301,L]

    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]

将我的评论转换为答案,以帮助未来的访问者轻松找到快速解决方案

Options +FollowSymlinks -MultiViews
RewriteEngine On

# redirect to https
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# pass query parameter to a php file internally
RewriteRule ^services/([\w-]+)/?$ services.php?param=$1 [L,NC,QSA]

# handle .php extension
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)/?$ $1.php [L]

#
必须对浏览器可见,才能在
#
甚至未发送到web服务器后作为一部分使用。锚定仅在浏览器中处理,不由web服务器处理server@anubhava我的理解是#可以作为重写URL的一部分从服务器发回,然后浏览器导航到#锚定为normal、 这不正确吗?使用查询字符串会更好吗?是的,这是正确的
可以从web服务器发送回浏览器,但这违背了您的要求,最后
我想重写URL,这样用户就看不到.php和#
@anubhava啊,是的,我明白了。下面的答案使用了301重定向,其中包括eps URL中的#。我还需要测试它。@anubhava谢谢你的帮助和建议谢谢你的回答。我会测试这个。它能让我在PHP中将最终路径组件作为GET参数处理吗?是的,它会在
services/
之后将部分作为GET参数发送到
service.PHP
,参数名为
param
。你可以将其修改为您想要的名称。感谢您的回答。这确实如我所希望的那样重写了URL,但我没有意识到#之后的URL部分无法传递,因此我可能需要另一种方法。